При работе в терминале довольно часто приходится копировать файлы. Чаще всего для этого используется команда cp Linux. Она поставляется по умолчанию во всех дистрибутивах и умеет копировать файлы и папки, а также сохранять их атрибуты в файловых системах Linux.
В этой статье мы рассмотрим что представляет из себя эта утилита, её синтаксис, основные опции, а также несколько примеров использования.
Содержание статьи:
Утилита имеет два возможных варианта синтаксиса для копирования файлов: копирование файла в другой файл с указанным именем:
$ cp опции /путь/к/файлу/источнику /путь/к/файлу/назначения
И копирование файла с сохранением его имени в указанную папку:
$ cp опции /путь/к/файлу/источнику /путь/к/директории/назначения
В первом случае, после выполнения команды файл-источник будет полностью перенесен в файл-назначения. Если же в качестве файла назначения выбрана директория, то файл или каталог будет записан в эту директорию с оригинальным именем.
Утилита имеет несколько интересных опций, которые могут сильно помочь при нестандартных задачах копирования, поэтому давайте их рассмотрим:
Кроме перечисленных выше опций, существуют опции, которые объединяют в себе несколько других с определёнными значениями. Во основные из них:
Теперь, когда вы знаете основные опции, можно перейти к практике. Давайте рассмотрим основные примеры использования утилиты cp.
Для примеров из этой статьи я создам несколько файлов file1, file2, file3, одну символическую ссылку link1 на файл file1 и жесткую ссылку на файл file3. Затем папку source и в ней file4, file5, file6 и папку destination. Вот так можно создать ссылки:
ln -s $(realpath file1) link1 ln file3 hlink1
ln -s $(realpath file1) link1
ln file3 hlink1
В результате получится такая структура:
Самый простой пример копирования файлов когда один файл копируется в другое место с заданным именем. Для этого надо указать имя файла в папке назначения. Например, для того чтобы скопировать файл 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 можно настроить имя резервной копии, Вот доступные варианты:
Например, для того чтобы использовать номер в имени резервной копии используйте такую команду:
cp --backup=numbered file1 destination
Ещё один вариант обработки существующих файлов, который может быть полезен для больших файлов – заменять только если файл источник новее или файл в папке назначения не существует. Для этого нужно использовать опцию -u или –upgrade:
cp -u source/* destination
В файловых системах Linux существует такое понятие как символические и жесткие ссылки. Команда cp может копировать их по разному. По умолчанию, как для жестких так и для символических ссылок создается копия файла, уже не связанная с оригиналом. Если вы хотите чтобы символические ссылки копировались именно как ссылки, то нужно использовать опцию -P:
cp -P link1 destination
Для жестких ссылок существует другой подход. Если вы хотите чтобы жесткая ссылка осталась ссылкой после копирования, нужно использовать опцию –preserve со значением links:
cp --preserve=links hlink1 destination
По умолчанию cp обновляет временные метки и атрибуты прав доступа файлов при копировании. Но иногда может возникнуть необходимость сохранить оригинальные значения атрибутов. Для этого можно использовать опцию –preserve. Вот её возможные параметры:
Если вы хотите оставить оригинального владельца и права доступа используйте опцию –preserve со значением mode,ownership или же опцию -p:
cp -p source/* destination
Если надо сохранить всю структуру файловой системы, в том числе символические и жесткие ссылки и временные метки, то можно использовать опцию -a:
cp -a source/* destination
Некоторые новые файловые системы, такие как Btrfs и ZFS поддерживают технологию Copy-on-Write. При её использовании, фактическое копирование данных из файла будет происходить только при его изменении. Эта функция работает в рамках одной файловой системы и сильно ускоряет копирование файлов. Но зато, их изменение может быть немного замедлено. По умолчанию cp использует Copy-on-Write только начиная с версии CoreUtils 9.0. но вы можете включить или отключить её вручную с помощью опции –reflink. Вот доступные значения:
Например, для того чтобы включить обязательное использование CoW добавьте –reflink=always в команду копирования:
cp -reflink=always file3 destination
Разреженные файлы, это файлы которые содержат последовательности нулевых байт и в них эти последовательности заменены на их описание. Это актуально для образов дисков Qemu или VirtualBox, которые могут содержать много пустого места, которое не обязательно записывать на диск. По умолчанию, cp создает разреженные файлы только если файл источник разрежен. Однако можно настроить его таким образом, чтобы все файлы содержащие последовательности нулей делались разреженными. Настроить это поведение можно с помощью опции –sparse. Вот возможные значения:
В качестве примера можно создать образ на основе /dev/zero размером 20 мегабайт:
dd if=/dev/zero of=image1 count=20 bs=1M
Если скопировать этот файл с опцией –sparse=always, то он станет разреженным и будет занимать значительно меньше места на диске:
cp --sparse=always ./image1 /destination
В этой статье была рассмотрена команда cp Linux. Эта команда существует довольно давно и не очень удобна для копирования больших файлов, поскольку тут нет вывода прогресса копирования. Но зато она поддерживает много других полезных функций. Практически все задачи, по копированию файлов в Linux могут быть выполнены с помощью этой утилиты.
Источник: https://losst.ru/ Материал распространяется под лицензией CC-BY-SA
Продолжая использовать данный сайт вы принимаете политику конфиденциальности и cookies