Полный цикл в digital

Утилита mv переименовать/перенести файл в Linux

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

Утилита имеет два возможных варианта синтаксиса для копирования файлов.

Синтаксис

Копирование файла в другой файл с указанным именем:

cp опции путь_к_файлу_источнику путь_к_файлу_назначения

Копирование файла с сохранением его имени в указанную папку:

cp опции путь_к_файлу_источнику путь_к_директории_назначения

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

Опции

  • --attributes-only не копировать содержимое файла, а только флаги доступа и владельца
  • -b, --backup создать резервную копию файла назначения если он существует
  • --copy-contents копировать содержимое для специальных файлов (сокеты, файлы устройств)
  • -f, --force удалить файл назначения перед попыткой записи в него если он существует
  • -i, --interactive спрашивать, нужно ли перезаписывать существующие файлы
  • -n, --no-clobber не перезаписывать существующие файлы
  • -P, --no-dereference копировать сами символические ссылки, а не то на что они указывают
  • -L, --dereference копировать не символические ссылки, а то, на что они указывают
  • -l, --link создавать жесткие ссылки вместо копирования
  • --preserve переносить указанные атрибуты с файла источника в файл назначения, возможные значения: mode, ownership, time‐stamps, context, links, xattr, all
  • --no-preserve не переносить указанные атрибуты
  • --parents сохранять путь, указанный в файле источнике, в папке назначения
  • -r, --recursive копировать папку Linux рекурсивно
  • --reflink использовать Copy on Write если это поддерживается файловой системой
  • -s, --symbolic-link не выполнять копирование файлов в Linux, а созавать символические ссылки
  • -S, --suffix указать суффикс для резервных копий файлов
  • --sparse настройка работы с разреженными файлами
  • -t, --target-directory считать файл-назначения директорией и копировать файл-источник или директорию-источник в эту директорию с оригинальным именем
  • -T, --no-target-directory считать директорию назначения файлом или директорией для записи данных. Если в качестве источника выбран файл, то он будет скопирован с новым именем. Если директория, то её содержимое будет скопировано в директорию назначения
  • -u, --upgrade скопировать файл, только если он был изменён
  • -x, --one-file-system рекурсивное копирование не должно выходить за пределы этой файловой системы
  • -v, --verbose максимально подробный вывод.

Кроме перечисленных выше опций, существуют опции, которые объединяют в себе несколько других с определёнными значениями:

  • -p сохранять владельца, временные метки и флаги доступа при копировании, аналогично --preserve=mode,ownership,timestamps
  • -d копировать символические и жесткие ссылки именно как ссылки, аналогично --no-dereference --preserve=links
  • -a режим резервного копирования, при котором сохраняются все атрибуты, ссылки, а также выполняется резервное копирование папок, аналогично --recursive --preserve=all, --no-dereference

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

Самый простой пример копирования файлов когда один файл копируется в другое место с заданным именем. Для этого надо указать имя файла в папке назначения. Например, для того чтобы скопировать файл file1 в папку destination с именем file10 нужно выполнить такую команду:

cp file1 destination/file10

Копирования файла в папку

Если вам не нужно менять имя файла или надо скопировать несколько файлов, то можно просто указать папку, куда их копировать не указывая имя файла. Например, для того чтобы скопировать файл file1 в папку destination с тем же именем выполните:

cp file1 destination/

Копирование папки в папку

Для копирования папок нужно использовать опцию -r (--recursive). Скопировать одну папку в другую довольно просто, если папка назначения существует. Для того чтобы скопировать папку source в папку destination выполните команду:

cp -r source destination

Или можно явно указать, что нужно именно скопировать source в destination с помощью опции -t:

cp -t file1 destination

Если папка destination не существует вы получите ошибку, вместо не очевидного поведения.

Копирование содержимого папки в папку

Для копирования содержимого одной директории в другую можно воспользоваться первым вариантом синтаксиса. Команда выглядит аналогичной предыдущему примеру, но она будет работать только если папки назначения не существует. Например, для того чтобы скопировать содержимое папки source в папку destination1 нужно использовать такую команду:

cp -r source destination1/

Если папка назначения существует, то в ней будет создана папка source. Для того чтобы избежать такого поведения можно использовать опцию -T:

cp -rT source destination/

Или же можно явно указать, что вас интересует именно копирование содержимого папки с помощью символа *:

cp source/* destination

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

Обработка существующих файлов

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

cp -i file1 destination

С помощью опции -n можно никогда не перезаписывать существующие файлы:

cp -n file1 destination

Кроме того, для существующих файлов можно делать резервную копию с помощью опции -b или --backup. Например, если использовать опцию -b, то в конце названия файла резервной копии будет добавлен символ тильды ~:

cp -b file1 destination

При использовании опции --backup можно настроить имя резервной копии, вот доступные варианты:

  • none резервная копия не делается
  • numbered к имени файла будет добавляться номер
  • simple в конец файла будет добавлен знак ~
  • existing если в директории назначения уже есть резервные копии, то будет использоваться такой же тип именования как и у них.

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

cp --backup=numbered file1 destination

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

cp -u source/* destination

Копирование ссылок

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

cp -P link1 destination

Для жестких ссылок существует другой подход. Если вы хотите чтобы жесткая ссылка осталась ссылкой после копирования, нужно использовать опцию --preserve со значением links:

cp --preserve=links hlink1 destination

Сохранение атрибутов при копировании

По умолчанию cp обновляет временные метки и атрибуты прав доступа файлов при копировании. Но иногда может возникнуть необходимость сохранить оригинальные значения атрибутов. Для этого можно использовать опцию --preserve. Вот её возможные параметры:

  • mode права доступа, сюда входит чтение, запись, выполнение и дополнительные флаги
  • ownership владелец и группа
  • time-stamps временные метки, такие как дата обновления, дата создания и дата последнего доcтупа
  • context контекст SELinux
  • links сохранение жестких ссылок
  • xattr дополнительные атрибуты, которые настраиваются с помощью команды chattr
  • all всё выше перечисленное.

Если вы хотите оставить оригинального владельца и права доступа используйте опцию --preserve со значением mode,ownership или же опцию -p:

cp -p source/* destination

Если надо сохранить всю структуру файловой системы, в том числе символические и жесткие ссылки и временные метки, то можно использовать опцию -a:

cp -a source/* destination
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг