- Как использовать команду cp? Простые примеры
- Расширенные возможности команды cp
- Еще больше опций cp для самых любознательных
- Полезные советы по использованию команды cp
Если вы начинаете работать с Linux или хотите лучше понять, как управлять файлами и папками в этой операционной системе, то команда cp — одна из самых важных утилит. Она позволяет копировать файлы и папки, делая вашу работу проще и быстрее.
В этой статье мы подробно расскажем о том, что такое команда cp, как её правильно использовать, приведем примеры и советы для новичков.
Что такое команда cp в Linux?
Команда cp (от английского “copy” — копировать) предназначена для копирования файлов и папок в системе Linux. Утилита cp очень полезна при создании резервных копий файлов, перемещении данных между папками или при подготовке файлов к обработке.
Основные особенности команды cp
- Копирует файлы из одного места в другое.
- Может копировать целые папки вместе с их содержимым.
- Позволяет сохранять исходные атрибуты файлов.
- Имеет множество опций для расширенного использования.
Как использовать команду cp? Простые примеры
- Простое копирование файла
- Копирование файла с новым именем
- Копирование нескольких файлов
- Копирование директорий, опция -r
Давайте рассмотрим базовые примеры использования команды cp. Пусть изначально у нас следующая структура, две директории dir1 и dir2, а так же файл source.txt внутри первой директории. У всех папок и файлов владелиц и группа waky_user и waky_group соответственно. Команда ll является алиасом для ls -l:
[root@waky examples]# ll -R
.:
total 0
drwxr-xr-x 2 waky_user waky_group 24 Jun 4 13:09 dir1
drwxr-xr-x 2 waky_user waky_group 6 Jun 4 13:08 dir2
./dir1:
total 0
-rw-r--r-- 1 waky_user waky_group 0 Jun 4 13:09 source.txt
./dir2:
total 0
[root@waky examples]#
Простое копирование файла
Если мы хотим скопировать файл с сохранением имени:
[root@waky examples]# cp dir1/source.txt dir2/
[root@waky examples]# ll dir2/
total 0
-rw-r--r-- 1 root root 0 Jun 4 13:19 source.txt
[root@waky examples]#
Сначала мы указали путь до файла dir1/source.txt, а дальше директорию назначения dir2/. Как результат, во второй папке появился новый файл, однако, хоть его содержимое идентично первоначальному файлу, у него своя временная метка, а пользователь и группа соответствует пользователю (root), который осуществил копирование.
Попробуем еще раз скопировать тот же файл.
[root@waky examples]# cp dir1/source.txt dir2/
[root@waky examples]# ll dir2/
total 0
-rw-r--r-- 1 root root 0 Jun 4 13:27 source.txt
[root@waky examples]#
Если файл с таким именем уже есть там, программа его перезапишет, можем увидеть это по временной метке. Будьте внимательны, чтобы не перезаписать, таким образом, файлы с одинаковым названием, но разным содержанием.
Копирование файла с новым именем
Если вы хотите скопировать файл и дать ему другое имя:
[root@waky examples]# cp dir1/source.txt dir2/copy.txt
[root@waky examples]# ll dir2/
total 0
-rw-r--r-- 1 root root 0 Jun 4 13:38 copy.txt
-rw-r--r-- 1 root root 0 Jun 4 13:27 source.txt
[root@waky examples]#
Теперь у вас будет копия файла с именем copy.txt.
Копирование нескольких файлов
Удалим лишние копии из второй директории. И подготовим еще пару файлов в первой:
[root@waky examples]# rm -f dir2/source.txt dir2/copy.txt
[root@waky examples]# ll dir2/
total 0
[root@waky examples]# touch dir1/source_2.txt dir1/source_3.txt
[root@waky examples]# ll dir1/
total 0
-rw-r--r-- 1 root root 0 Jun 4 13:44 source_2.txt
-rw-r--r-- 1 root root 0 Jun 4 13:44 source_3.txt
-rw-r--r-- 1 waky_user waky_group 0 Jun 4 13:09 source.txt
[root@waky examples]#
Чтобы скопировать сразу несколько файлов в одну папку:
[root@waky examples]# cp dir1/source.txt dir1/source_2.txt dir1/source_3.txt dir2/
[root@waky examples]# ll dir2/
total 0
-rw-r--r-- 1 root root 0 Jun 4 13:45 source_2.txt
-rw-r--r-- 1 root root 0 Jun 4 13:45 source_3.txt
-rw-r--r-- 1 root root 0 Jun 4 13:45 source.txt
[root@waky examples]#
Все три копии оказались в указанной директории.
Копирование директорий, опция -r
Для копирования папок нужно использовать опцию -r (рекурсивное копирование):
[root@waky examples]# cp -r dir1/ dir3/
[root@waky examples]# ll
total 0
drwxr-xr-x 2 waky_user waky_group 64 Jun 4 13:44 dir1
drwxr-xr-x 2 waky_user waky_group 64 Jun 4 13:45 dir2
drwxr-xr-x 2 root root 64 Jun 4 13:48 dir3
[root@waky examples]# ll dir3/
total 0
-rw-r--r-- 1 root root 0 Jun 4 13:48 source_2.txt
-rw-r--r-- 1 root root 0 Jun 4 13:48 source_3.txt
-rw-r--r-- 1 root root 0 Jun 4 13:48 source.txt
[root@waky examples]#
Это создаст новую директорию dir3/ и скопирует в нее все содержимое из dir1/.
Расширенные возможности команды cp
- Копирование с подтверждением опция -i (–interactive)
- Подробный вывод, опция -v (–verbose)
- Обновление файла, опция -u (–update)
- Копирование с сохранением атрибутов, опция -p (–preserve)
Команда cp обладает множеством опций, которые делают её более гибкой и удобной.
Копирование с подтверждением, опция -i (–interactive)
Перед перезаписью существующего файла команда спросит подтверждение:
[root@waky examples]# cp -i dir1/source.txt dir2/
cp: overwrite 'dir2/source.txt'? y
[root@waky examples]#
Если файл уже есть в целевой папке, появится запрос на подтверждение перезаписи. Отвечаем y (как yes). Использование подтверждения -i удобно для предотвращения случайных ошибок.
Подробный вывод, опция -v (–verbose)
Показывает подробный вывод процесса копирования:
[root@waky examples]# cp -r -v dir1/ dir4/
'dir1/' -> 'dir4/'
'dir1/source.txt' -> 'dir4/source.txt'
'dir1/source_2.txt' -> 'dir4/source_2.txt'
'dir1/source_3.txt' -> 'dir4/source_3.txt'
[root@waky examples]#
Мы скопировали первую директорию, а использование -v добавило в вывод информацию, о том, какие конкретно объекты куда были скопированы.
Обновление файла, опция -u (–update)
Обновление файла – копирует файлы только если их версия новее (по времени изменения) или его нет в целевой папке:
[root@waky examples]# cp -r -v -u dir1/ dir4/
[root@waky examples]#
При повторной попытке скопировать первую директорию, ни один файл не был обновлен, так как файлы в исходной папке не менялись со времени копирования.
Имитируем изменения файла dir1/source.txt и повторим копирование:
[root@waky examples]# touch dir1/source.txt
[root@waky examples]# cp -r -v -u dir1/ dir4/
'dir1/source.txt' -> 'dir4/dir1/source.txt'
[root@waky examples]#
Был скопирован только обновленный файл. Использование -u помогает избежать излишнего копирования, например при обновлении резервных копий.
Копирование с сохранением атрибутов, опция -p (–preserve)
Сохраняет атрибуты файла: права доступа, временные метки и т.д. Как мы уже видели, при копировании, новый файл получает владельца и группу пользователя, который осуществил копирование, а временная метка соответствует времени копирования:
[root@waky examples]# ll dir1/source.txt
-rw-r--r-- 1 waky_user waky_group 0 Jun 5 04:55 dir1/source.txt
[root@waky examples]# ll dir4/source.txt
-rw-r--r-- 1 root root 0 Jun 5 04:44 dir4/source.txt
[root@waky examples]#
Если хотим сохранить эти атрибуты как у файла источника:
[root@waky examples]# cp -p dir1/source.txt dir4/source.txt
[root@waky examples]# ll dir4/source.txt
-rw-r--r-- 1 waky_user waky_group 0 Jun 5 04:55 dir4/source.txt
[root@waky examples]#
Так как в Linux права и доступы управляются принадлежностью к пользователю или группе, использование -p позволяет сохранить для копий тот же уровень доступа.
Еще больше опций cp для самых любознательных
У команды cp есть довольно большое количество опций. Некоторые из них очень специфичные и редко употребимые. Рассмотрим еще несколько, которые могут пригодиться в вашей повседневной работе.
Работа со ссылкам
По умолчанию утилита cp при копировании создает отдельный объект. Вместо этого мы можем создавать жесткие и символические ссылки. Подробнее о различии двух видов ссылок можно узнать из статьи, посвященной команде ln.
Если, вместо копирования, мы хотим создавать жесткие ссылки, используем опцию -l (–link):
[root@waky examples]# ll dir1/
total 0
-rw-r--r-- 1 root root 0 Jun 4 13:44 source_2.txt
-rw-r--r-- 1 root root 0 Jun 4 13:44 source_3.txt
-rw-r--r-- 1 waky_user waky_group 0 Jun 5 04:55 source.txt
[root@waky examples]# cp -l dir1/source.txt dir1/hardlink.txt
[root@waky examples]# ll dir1/
total 0
-rw-r--r-- 2 waky_user waky_group 0 Jun 5 04:55 hardlink.txt
-rw-r--r-- 1 root root 0 Jun 4 13:44 source_2.txt
-rw-r--r-- 1 root root 0 Jun 4 13:44 source_3.txt
-rw-r--r-- 2 waky_user waky_group 0 Jun 5 04:55 source.txt
[root@waky examples]#
В результате такого копирования, новый файл будет указывать на тот же inode, что и файл источник.
Чтобы создавать символические ссылки используйте -s (–symbolic-link):
[root@waky examples]# cd dir1/
[root@waky dir1]# cp -s source.txt symlink.txt
[root@waky dir1]# ll
total 0
-rw-r--r-- 2 waky_user waky_group 0 Jun 5 04:55 hardlink.txt
-rw-r--r-- 1 root root 0 Jun 4 13:44 source_2.txt
-rw-r--r-- 1 root root 0 Jun 4 13:44 source_3.txt
-rw-r--r-- 2 waky_user waky_group 0 Jun 5 04:55 source.txt
lrwxrwxrwx 1 root root 10 Jun 5 06:26 symlink.txt -> source.txt
[root@waky dir1]#
Есть два способа копировать символические ссылки. Копировать сами символические ссылки, а не объект, на который они указывают – опция -P (–no-dereference):
[root@waky dir1]# cp -P symlink.txt symlink_Pcopy.txt
[root@waky dir1]# ll
total 0
-rw-r--r-- 2 waky_user waky_group 0 Jun 5 04:55 hardlink.txt
-rw-r--r-- 1 root root 0 Jun 4 13:44 source_2.txt
-rw-r--r-- 1 root root 0 Jun 4 13:44 source_3.txt
-rw-r--r-- 2 waky_user waky_group 0 Jun 5 04:55 source.txt
lrwxrwxrwx 1 root root 10 Jun 5 06:33 symlink_Pcopy.txt -> source.txt
lrwxrwxrwx 1 root root 10 Jun 5 06:26 symlink.txt -> source.txt
[root@waky dir1]#
Копировать не ссылки, а объекты, на которые те указывают – опция -L (–dereference):
[root@waky dir1]# cp -L symlink.txt symlink_Lcopy.txt
[root@waky dir1]# ll
total 0
-rw-r--r-- 2 waky_user waky_group 0 Jun 5 04:55 hardlink.txt
-rw-r--r-- 1 root root 0 Jun 4 13:44 source_2.txt
-rw-r--r-- 1 root root 0 Jun 4 13:44 source_3.txt
-rw-r--r-- 2 waky_user waky_group 0 Jun 5 04:55 source.txt
-rw-r--r-- 1 root root 0 Jun 5 06:36 symlink_Lcopy.txt
lrwxrwxrwx 1 root root 10 Jun 5 06:33 symlink_Pcopy.txt -> source.txt
lrwxrwxrwx 1 root root 10 Jun 5 06:26 symlink.txt -> source.txt
[root@waky dir1]#
Обращение с существующими файлами
Распространенная ситуация, когда при копировании в директории назначения уже есть такие файлы. Утилита cp имеет несколько опций, для управления политикой в отношение одинаковых файлов. Запрос подтверждения (-i) мы уже рассматривали, а вот еще парочка:
Опция -b (–backup) создаст резервную копию уже существующего файла:
[root@waky dir1]# cd ..
[root@waky examples]# echo "source" > dir1/test.txt
[root@waky examples]# echo "destination" > dir2/test.txt
[root@waky examples]# cp -b dir1/test.txt dir2/test.txt
[root@waky examples]# ll dir2/
total 8
-rw-r--r-- 1 root root 0 Jun 4 13:45 source_2.txt
-rw-r--r-- 1 root root 0 Jun 4 13:45 source_3.txt
-rw-r--r-- 1 root root 0 Jun 5 04:39 source.txt
-rw-r--r-- 1 root root 7 Jun 5 06:48 test.txt
-rw-r--r-- 1 root root 12 Jun 5 06:47 test.txt~
[root@waky examples]# cat dir2/test.txt
source
[root@waky examples]# cat dir2/test.txt~
destination
[root@waky examples]#
Содержимое файла назначения dir2/test.txt было заменено содержимым файла источника, но первоначальное содержимое файла назначения было сохранено в файле dir2/test.txt~. Это позволяет исключить безвозвратную утрату, в случае незапланированной перезаписи важных файлов.
В предыдущем примере резервный файл имеет суффикс по умолчанию (~). Опция -S (–suffix) позволяет задать суффикс:
[root@waky examples]# cp -b -S _old dir1/test.txt dir2/test.txt
[root@waky examples]# ll dir2/
total 16
-rw-r--r-- 1 root root 0 Jun 4 13:45 source_2.txt
-rw-r--r-- 1 root root 0 Jun 4 13:45 source_3.txt
-rw-r--r-- 1 root root 0 Jun 5 07:20 source.txt
-rw-r--r-- 1 root root 7 Jun 5 07:29 test.txt
-rw-r--r-- 1 root root 12 Jun 5 06:47 test.txt~
-rw-r--r-- 1 root root 7 Jun 5 07:29 test.txt_old
[root@waky examples]#
При совпадении, прежняя версия файла будет иметь в конце названия _old.
Опция -f (–force) позволяет удалить файл назначения, а после создать новый и записать в него содержимое копируемого файла:
[root@waky examples]# cp -f dir1/source.txt dir2/source. txt
[root@waky examples]#
Так, в случае совпадения имен, происходит не перезаписи существующего файла, а удаление и создание нового. Это важно если мы хотим быть уверены, что копия не унаследует никаких атрибутов от имеющегося ранее файла.
Опция -n (–no-clobber) отключает перезапись существующих файлов:
[root@waky examples]# cp -v dir1/source.txt dir2/source.txt
'dir1/source.txt' -> 'dir2/source.txt'
[root@waky examples]# cp -v -n dir1/source.txt dir2/source.txt
[root@waky examples]#
Это позволяет избежать перезаписи, но при этом совпавшие файлы источники не будут скопированы на новое место.
Экзотика
Если нам неважно содержимое файла, а лишь его атрибуты, опция –attributes-only позволяет копировать атрибуты без содержания.
[root@waky examples]# cat dir1/test.txt
source
[root@waky examples]# cp --attributes-only dir1/test.txt dir4/attributes.txt
[root@waky examples]# cat dir4/attributes.txt
[root@waky examples]#
Как результат, конечный файл пуст.
Опция –parents копирует не только файл, но и путь, указанный в команде.
[root@waky examples]# cp --parents dir1/test.txt dir4/
[root@waky examples]# ll dir4/dir1/
total 4
-rw-r--r-- 1 root root 7 Jun 5 07:49 test.txt
[root@waky examples]#
Была создана дополнительная директория dir1 внутри dir4.
Комбинированные опции
С утилитой можно использовать несколько опций, просто перечислив их в команде, но есть пару опций, которые уже сочетают в себе работу нескольких других.
Опция -d позволяет копировать ссылки именно как ссылки, сочетает в себе –no-dereference –preserve=links
Опция -a режим рекурсивного копирования, при котором сохраняются все атрибуты, ссылки, сочетает –recursive –preserve=all, –no-dereference
Полезные советы по использованию команды cp
- Перед массовым копированием рекомендуется проверить содержимое директорий источника и назначения командой ls. Если собираетесь копировать файлы, зависимые от доступов: ls –l
- Используйте опцию -i, чтобы избежать случайной перезаписи важных файлов. Во многих дистрибутивах Linux по умолчанию задан алиас, подменяющий команду cp на комбинацию cp –i. Это можно проверить с помощью команды: which cp.
- Для копирования больших объемов данных лучше использовать опцию -v, чтобы видеть прогресс. А при копировании большого количества файлов не будет лишним сохранить вывод команды в отдельный файл.
- Не забывайте о рекурсивном копировании -r при работе с директориями. Без этого, программа просто откажется их копировать.
Заключение
Команда cp — это мощный инструмент для работы с файлами и папками в Linux. Она проста в использовании для новичков и обладает множеством функций для опытных пользователей.
Правильное использование этой команды поможет вам быстро создавать резервные копии, перемещать данные и управлять файлами без лишних усилий.
Если вы только начинаете изучать Linux, постарайтесь запомнить основные способы использования команды.
Когда освоитесь с базовыми опциями, подумайте, где в своей работе вы могли бы использовать остальные, более специфические опции, и начинайте применять их. Так вы быстрее освоите все преимущества данного инструмента.