Секреты Терминала. Часть 4: Операции над объектами

TerminalsМы возвращаемся к нашему циклу статей о Терминале Mac OS X, где излагаются премудрости работы на Маке через командную строку. Сегодня мы подходим к самому важному уроку — операции над файлами и папками. Мы рассмотрим команды для копирования, перемещения, переименования и удаления объектов — cp, mv, rm. Не удивляйтесь, что для четырёх названных действий предназначены три команды. Как вы узнаете из дальнейшего повествования, одна из них умеет гораздо больше, чем кажется сначала.

Итак, начнём с копирования и команды cp.

cp

Стандартный синтаксис команды копирования такой:

cp  -(параметры) (что копируем) (куда копируем)

Параметры команды, путь к копируемому файлу и адрес для размещения копии разделяются пробелами. А если пробел есть внутри какого-то из путей, то, как вы помните, надо либо поставить перед ним обратный слэш (\ пробел) или заключить весь путь в одинарные кавычки (‘путь с пробелами’).

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

cp -R

Этот параметр нужен, если вы копируете папку. Обратите внимание на очень важный нюанс: от того, как вы напишете путь к папке, зависит то, как она скопируется. Возьмёме простой пример: откройте Терминал и введите команду:

cp Sites /

Вы получите ошибку о том, что Sites — это директория, и она не может быть скопирована.

term4-1Теперь попробуйте немного другой вариант:

cp -R Sites /

Папка с сайтами скопируется на Рабочий стол. Попробуйте третий вариант:

cp -R Sites/ /

Вы увидите, что на Рабочий стол скопировалась не сама папка сайтов, а только её содержимое.

Запомните это правило — слэш в конце пути копируемой папки не копирует её саму.

cp -f

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

cp -i

Это параметр для тех, кто склонен острожничать. При первом же совпадении имён вы увидите вот такой вопрос:

term4-2От того, что вы нажмёте на клавиатуре (y или n), будет зависеть судьба файла в папке назначения. Количество таких вопросов будет равно количеству объектов с совпадающими именами.

cp -n

Это полная противоположность параметру -f. Копирование не перезапишет ни один файл с совпадающими именами и не задаст вам никаких лишних вопросов.

cp -p

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

cp -v

В этом случае Терминал покажет вам все скопированные файлы в формате «что копировалось» -> «куда скопировалось»:

term4-3Как всегда, параметры можно совмещать. И для вашего удобства параметр -R вполне разрешено писать строчными буквами.

cp -rfpv Sites ~/Desktop

Возникает вопрос, а что будет, если задать заведомо противоречащие параметры, например:

cp -nf

Отвечаем: в этом случае имеет значение порядок параметров. Второй параметр окажется сильнее первого, и копирование затрёт совпадающие по именам файлы. А вот если написать:

cp -fn

то параметр -n «пересилит» параметр -f.

cp -a

(эквивалент cp -dpR) — в этом случае команда не будет обрабатывать символьные ссылки, рекурсивно обрабатывает все подкаталоги и сохраняет новые атрибуты файлы, вроде имени владельца. Очень удобна в том плане, что всякого рода «ярлыки» и прочие вещи, которые информационной ценности не несут, будут просто проброшены данной командой.

mv

Данная команда имеет двойное назначение — она умеет перемещать и переименовывать объекты. Очень многое здесь зависит от синтаксиса. Общий принцип работы у команды mv схож с cp:

mv -(параметры) (что перемещаем/переименовавываем) (куда перемещаем/во что переименовывыем)

Допустим, вы хотите переименовать файл File1.txt на рабочем столе в File2.txt. В Терминале вам понадобится команда:

mv ~/Desktop/File1.txt ~/Desktop/File2.txt

Запомните: если в качестве второго адреса в команде mv задан путь к файлу, то произойдёт переименование. Разумеется, папка в первом и во втором пути должна быть одна и та же, тогда это уже не будет просто переименованием. Например, если вы введёте команду:

mv ~/Desktop/File1.txt /File2.txt

то с Рабочего стола файл File1.txt бесследно исчезнет. Зато в корне диска появится файл File2.txt с точно таким же содержимым.

И третья ситуация — просто перемещение (без переименования):

mv ~/Desktop/File1.txt ~/Downloads

Файл будет перемещён с Рабочего стола в ваше папку «Загрузки». Иными словами, если в качестве второго адреса в команде mv задан путь к папке, то произойдёт перемещение.

Теперь о параметрах команды mv. Их всего четыре, и все они совпадают с параметрами команды cp:

  • mv -f форсирует перезапись объектов с одинаковыми именами
  • mv -n предотвращает такую перезапись
  • mv -i каждый раз спросит вас о перезаписи
  • mv -v покажет подробные сведения о перемещении

Обратите внимание на отсутствие параметра -R. Команде mv абсолютно всё равно, с чем она имеет дело. Она без лишних вопросов умеет перемещать и переименовывать как файлы, так и папки.

rm

Эта команда предназначена для удаления объектов. Из всех рассмотренных в нашем курсе команд она наиболее опасна. Файлы удаляются навсегда и в обход Корзины. Восстановить их весьма проблематично. Именно поэтому всегда дважды (а то и трижды) проверяйте введённые вместе с командой rm параметры и аргументы!

Синтаксис у неё ещё проще:

rm -(параметры) (путь к удаляемому объекту)

А вот её параметры:

  • rm -f форсирует удаление без предупреждений
  • rm -i запрашивает подтверждение на стирание каждого объекта
  • rm -v удаляет объекты в подробном режиме

Обратите внимание, что rm, как и cp, не умеет по умолчанию удалять директории. В связи с этим для неё актуален параметр -R (или -r).

Есть у rm и ещё один занятный параметр для конфиденциальной информации:

rm -P

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

Покажем ещё раз опасность команды rm. Допустим, вы хотели удалить папку Temp в корне диска:

rm -rf /Temp

и случайно опечатались, поставив пробел после слэша:

rm -rf / Temp

Так как у rm есть только один аргумент, она воспримет только то, что находится между параметрами -rf и следующим пробелом. А там у вас / — т.е. всё содержимое диска. А теперь подумайте, что ждёт ваш Мак, если вы выполните эту команду от имени корневого администратора (с приставкой sudo).

В связи с этим, старайтесь не использовать команду rm без параметра -i. Хоть это и нудно, зато обезопасит вас от многих роковых ошибок.

rmdir

Это безопасный аналог команды rm, применим в том случае, когда каталог пуст, в противном случае команда не удалит его, тем самым обезопасив Вас, не стирая папку с файлами, как если бы мы вызвали rm -rf. Настоятельно рекомендуем применять эту команду, если стоит цель удалить заведомо пустой каталог, не стоит применять рекурсивное удаление, мы можем затронуть то, что не хотели бы.

На этом сегодняшний урок по Терминалу можно считать оконченным. Далее по курсу — создание папок и файлов.