Воздействие на файлы и директории

В позапрошлом материале мы научились считывать содержание директорий и файлов. Теперь настало время оказывать воздействие на них 🙂

Сегодня пора познакомиться с такими не менее важными операциями копирование, перемещение, переименование и удаление файлов и директорий, создание новых директорий. Данные операции являются основными.

Если быть совсем откровенным, то некоторые из этих задач проще выполнить при помощи файлового менеджера в графическом интерфейсе. Например, перемещение и копирование файла или директории выполняются простым перетаскиванием значка из одной области (директории) в другую. Тогда возникает вопрос, а в чем необходимость напрягаться с командной строкой? Разумеется, в огромном потенциале и гибкости.

С помощью графического интерфейса действительно проще выполнять простые операции с файлами. Но, как только нужно выполнить что-либо чуть сложнее, на помощь приходит Linux Shell 😉 Например, нам необходимо скопировать все фотографии из одной директории (с фотоаппарата) в другую, но только те, которых там нет (только те, что еще не скачали на компьютер). А если копируемый файл уже присутствует в директории, куда мы пытаемся его скопировать, но его нужно заменить, но лишь при условии, что копируемый файл наиболее свежий (например, заменить оригинал на ретушь, но не наоборот). Слишком сложно в графическом интерфейсе. Слишком просто в командной строке.

Разморозим виртуальную машину. Очень важно помимо чтения данного материала испытывать его в действии. А еще лучше, пытаться ставить опыты изменяя имена файлов или директории. Так можно будет быстрее заложить базовые команды в память рук, освободив головной мозг для более сложных задач. Достаточно вспомнить любую пешую прогулку. Мы можем о чем-то задумываться, продумывать путь, но никак не думаем о движении своих ног 🙂

Подстановки

Прежде чем перейти к самим командам, которые достаточно примитивны, поговорим немного о шаблонах, делающих команды достаточно удобными. В интерфейсе командной строки очень часто используются имена файлов, поэтому для быстрого обращения к группам файлов существуют специальные символы. Они называются подстановками и позволяют выбирать файлы по шаблонам символов. Посмотрим на наиболее частые.

*
Соответствует любой подстроке символов, включая пустой строке.
?
Соответствует любому символу. Присутствие символа обязательно (не соответствует пустой строке).
[символы]
Соответствует любому символу из указанного набора символы. Набор символов может быть обозначен классом символов POSIX: [:alnum:] — любая буква или цифра, [:alpha:] — любая буква, [:digit:] — любая цифра, [:upper:] — любая буква в верхнем регистре, [:lower:] — любая буква в нижнем регистре.
[!символы]
Соответствует любому символу, который отсутствует в указанном наборе символы.

При помощи подстановок можно составить очень сложные критерии выборки файлов. Рассмотрим несколько примеров.

  • * — любые файлы
  • g* — файлы, имена которых начинаются с символа «g»
  • b*.txt — файлы с именами, начинающимися с символа «b» и заканчивающимися последовательностью символов «.txt»
  • Data??? — файлы, имя которых начинается со строки «Data» после которой следует ровно три любых символа
  • [abc]* — файлы с именами, начинающимися с одного из символов «a», «b» или «c», за которым могут следовать любые символы (также под выборку попадают имена файлов «a», «b» и «c»)
  • [[:upper:]]* — все файлы с именами, которые начинаются с буквы в верхнем регистре
  • BACKUP.[[:digit:]][[:digit:]] — файлы, имена которых начинаются со строки «BACKUP.» и заканчиваются двумя любыми цифрами
  • *[![:lower:]] — любые файлы, имена которых не заканчивается буквой в нижнем регистре.

Подстановку можно использовать почти с любыми командами, которые принимают в качестве аргументов имя файла.

Если быть более честным, то эти подстановки являются обычным развертыванием строк. Команда даже не видит сам шаблон подстановки, к ней поступает список файлов. Но это уже материал из будущего 🙂

Создание директории

Для создания новой директории можно воспользоваться командой mkdir. После имени команды через пробел нужно указать имена создаваемых директорий (для создания в рабочей директории) или пути к ним. Попробуем создать директорию test и перейдем в нее.

Отлично, мы только что создали директорию и перешли в нее. Как мы видим в ней пока нет ни файлов, ни директорий 🙁

С помощью графического интерфейса создавать директорию тоже достаточно просто. Я уверен, большинство читателей уже делали это не раз (возможно в других операционных системах, например в Windows создавали свои папки). Но, в отличии от графических файловых менеджеров, команда mkdir умеет гораздо больше чем создание одной директории за раз. Попробуем за раз создать несколько директорий, указав их имена через пробел.

Мы создали сразу пять директорий dir1, dir2, dir3, dir4 и dir5, а команду ввели всего один раз. В графическом файловом менеджере для создания каждой директории нам потребовалось бы выполнять весь процесс создания для каждой директории, это куча движений мыши и нажатий на кнопки.

Но и это еще не все. На может потребоваться создать директорию в директории, которой еще не существует. Например, мы хотим отсортировать фото по годам, месяцам и дням). Для этого нужно сначала создать родительскую директорию (photo), в ней еще одну директорию (год), в ней еще одну (месяц) и в ней еще одну (день). Но только не с mkdir! При использовании команды mkdir можно передать параметр -p, с которым будут созданы все несуществующие промежуточные директории. Попробуем сделать это.

Отлично. Мы создали директорию photo, внутри которой две директории 2010 и 2014, в директории 2010 создана директория 12 с пустой поддиректорией 05, а внутри 2014 директория  01 с пустой поддиректорией 10. Это все при помощи одной команды, всего лишь указав желаемые пути для наших директорий 10 и 05. Родительские директории photo, photo/2010photo/2014photo/2014/01, photo/2010/12 были созданы автоматически.

Безопасное удаление директории

Безопасно удалить пустую директорию можно с помощью команды rmdir. После имени команды через пробел нужно указать имена создаваемых директорий (для создания в рабочей директории) или пути к ним. Возможно использовать подстановки.

Под безопасным удалением я имею ввиду удаление лишь только в том случае, если директория пустая. Когда директория содержит файлы или директории, команда rmdir её не удалит. Поэтому нет необходимости предварительно проверять содержание. В обычной жизни, выбрасывая ящик, по ошибке можно выбросить и его содержимое, если заранее не убедиться, что он пуст. Команда rmdir гарантированно позволяет избежать таких последствий.

Настало время выбросить что-то ненужное. Попробуем избавиться от директории dir1.

Как видно, директории dir1 больше нет. Теперь попробуем таким же способом стереть директорию photo.

Не получилось 🙁 Мы получили сообщение об ошибке выполнения операции. В нем говорится, что наша директория photo не пустая. Если мы помним, в ней у нас есть две директории 2010 и 2014.

А вот директории dir2, dir3, dir4 и dir5 у нас пустые и нам больше не нужны. Попробуем их удалить. Можно удалять по одной или сразу перечислить их мена через пробел. Но есть кое-что проще — подстановки шаблонов имени. Если присмотреться внимательнее к именам директорий dir2, dir3, dir4 и dir5, то можно заменить, все они начинаются «dir». Как мы уже видели при помощи команды ls ранее, других файлов и директорий с именами, начинающимися с «dir» нет. Поэтому нам подойдет шаблон «dir*», выборка по которому затронет только директории dir2, dir3, dir4 и dir5. А использую команду rmdir мы можем не беспокоится о последствиях. Ведь она проверяет, чтобы удаляемый объект был обязательно директорией и обязательно пустой. Команда rmdir не позволит нам удалить какую-либо информацию. Удалим директории dir2, dir3, dir4 и dir5.

Отлично, теперь мы умеем безопасно удалять пустые директории 🙂

Команда rmdir

Копирование файлов и директорий

Для копирования файлов и директорий в Linux существует программа cp. В своей простой форме она копирует один файл, создавая его копию с другим именем.

Помимо этого, команда cp умеет копировать сразу множество файлов и директорий в другую директорию (сохраняя при этом имена файлов).

Попробуем что-то скопировать. Мы уже находимся в директории test, в которой у нас создана директория photo, но совсем нет файлов 🙁 Пора бы это исправить. Скопируем файл /etc/prelink.conf сохранив копию под именем test.txt в рабочую директорию.

У нас появилась копия файла /etc/prelink.conf. Попробуем скопировать файл /etc/hosts в рабочую директорию. Копию тоже назовем test.txt (такой файл уже существует).

Как видно, программа не выдала сообщения об ошибке, но нового файла у нас не появилось. Мы перезаписали старый файл test.txt содержанием файла /etc/hosts, безвозвратно стерев старое содержание файла. Так ведь легко потерять и очень важную информацию 🙁

К счастью, у программы cp существует ключ -i. При его использовании, перед заменой существующего файла программа спросит разрешение на перезапись содержания. Чтобы согласиться нужно ввести ответ «y» (после символа «y» могут следовать любые символы) и нажать Enter. Для отказа следуют ввести «n» (или любую строку, не начинающуюся с «y») и нажать Enter. Попробуем снова создать копию файла /etc/prelink.conf под именем test.txt с использованием параметра -i.

Как видим, на этот раз перед заменой содержания файла text.txt программа cp спросила на это разрешение.

Если мы заранее знаем, что не хотим заменять содержание существующего файла, можно воспользоваться параметром -n. При его использовании, существующие файлы при копировании заменены не будут.

Попробуем снова скопировать файл /etc/hosts в рабочую директорию. Копию тоже назовем test.txt (такой файл уже существует), но в этот раз используем ключ -n.

Как видно, программа не выдала сообщение об ошибке. Но содержание файла заменено не было. Мы можем в этом легко убедиться. Для этого по очереди с помощью программы less ознакомимся с содержанием файлов text.txt и /etc/hosts. Видим разницу? Значит мы ничего не заменили и не стерли 🙂

Еще при помощи команды cp можно копировать файлы в директории сохраняя имена файлы (имя копии внутри директории будет соответствовать имени копируемого файла) — это удобно при копировании сразу нескольких файлов.

Для начала создадим две директории dir1, dir2 и dir3.

Теперь скопируем файл test.txt в директорию dir1.

Мы указали, что хотим скопировать файл test.txt и сохранить копию в dir1. Именно такой результат мы и получили. Так как мы указали как место сохранения копии существующую директорию, то копия была помещена в нее с исходным именем файла.

Теперь скопируем файл test.txt в test2.

Как видим, мы получили новый файл test2 с копией содержимого файла test.txt. Если мы указываем как место сохранения копии имя существующего файла, либо не существующее имя, то копия содержимого сохраняется в файл с указанным именем (если он не существует, то будет создан).

При копировании файла в директорию можно ошибиться в имени директории и тогда, вместо желаемого результата мы получим еще один файл с указанным «ошибочным» именем. Ошибку легко избежать, если после имени директории поставить символ «/» (слэш).

Как видим файл test2 был успешно скопирован в директорию dir1, а при попытке копирования в несуществующую директорию dir9 мы получили сообщение об ошибке, без создания ненужного файла dir9.

С помощью программы cp можно копироваться сразу несколько файлов в директорию, указывая их имена через пробел, либо использую подстановки.

А еще программа cp умеет копировать директории и их содержимое. Для этого существует ключ -R, который указывает на необходимость копирования содержимого.

Как видим, мы успешно скопировали директорию dir1 внутрь директории dir2. По аналогии с файлами, можно скопировать директорию создав копию под другим именем.

Теперь у нас есть файлы и директории с файлами, а значит есть что переименовывать, перемещать и удалять 🙂

Команда cp

Переименование и перемещение

Программа mv выполняет переименование и перемещение файлов и директорий. В отличии от копирования, при котором сохраняются и сами исходные объекты, и их копии, при перемещении или переименовании исходные файлы и директории не сохраняются. Использование команды mv схоже с использованием команды cp. У команды mv отсутствует ключ -R, так как при переименовании или перемещении директории, содержимое остается в ней (нет необходимости указывать отдельно на необходимость его копирования).

Переименуем файл test2 в test2.txt.

Создадим директорию dir5 и переместим в нее файлы test.txt и test.txt.

Переименуем директорию dir5 в test.

Теперь переместим директории dir1, dir2, dir3 и dir4 в директорию test. Чтобы не перечислять все директории списком, можно воспользоваться подстановкой по шаблону.

Из директории test переместим файлы test и test2.txt обратно в рабочую директорию. Для простоты воспользуемся подстановкой, а на рабочую директорию сошлемся с использованием специального обозначения «.» (точка).

Отлично, файлы возвращены в рабочую директорию и теперь у нас есть что удалять 🙂

Команда mv

Удаление файлов и директорий

Мы уже умеем безопасно удалять пустые директории без потери данных при помощи программы rmdir. Но бывает необходимость уничтожать данные (удалять файлы). Для удаления файлов есть программа rm. После имени команды следует указать список удаляемых файлов через пробел. Возможно использование подстановки имени файла по шаблону.

Удалим файл test2.txt.

Файл был удален. Следует с осторожностью использовать программу rm. Данные удаляются без возможности восстановления. Особенно легко ошибиться и удалить что-то нужное при использовании подстановок. При помощи ключа -i перед удалением каждого объекта будет запрошено подтверждение. Чтобы согласиться нужно ввести ответ «y» (после символа «y» могут следовать любые символы) и нажать Enter. Для отказа следуют ввести «n» (или любую строку, не начинающуюся с «y») и нажать Enter. Попытаемся удалить файл test.txt, но после запроса подтверждения откажемся от удаления.

Для удаления директории следует использовать ключ -r. При передаче параметра -r программа rm вначале удаляет все файлы и директории (включая вложенные) внутри удаляемой директории, после чего саму директорию. Удалим директорию photo.

Теперь попробуем удалить что-либо с использованием подстановок. Чтобы обезопасить себя и предварительно узнать какие файлы пройдут выборку по шаблону, воспользуемся следующим трюком. Вместо команды rm воспользуемся командой ls, передав ей в качестве аргумента нашу подстановку. Таким образом будут перечислены все выбранные объекты по шаблону. Если результат нас устроит, то можно смело удалять программой rm.

Вернемся в родительскую директорию, которая является домашней, и удалим освободившуюся директорию test. Без ключа -r команда rm выдаст предупреждение при попытке удалить директорию и не удалит ее. Для удаления пустых директорий всегда следует пользоваться программой rmdir вместо ключа -r программы rm. Это позволит сохранить данные в целости и сохранности 🙂

Лишнее убрано. Теперь заморозим виртуальную машину.

Команда rm

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *