Утилита cp переименовать/перенести файл в 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контекст SELinuxlinksсохранение жестких ссылокxattrдополнительные атрибуты, которые настраиваются с помощью команды chattrallвсё выше перечисленное.
Если вы хотите оставить оригинального владельца и права доступа используйте опцию --preserve со значением mode,ownership или же опцию -p:
cp -p source/* destination
Если надо сохранить всю структуру файловой системы, в том числе символические и жесткие ссылки и временные метки, то можно использовать опцию -a:
cp -a source/* destination