CP Linux пример: как использовать команду copy в Linux.

Если вы начинаете работать с Linux или хотите лучше понять, как управлять файлами и папками в этой операционной системе, то команда cp — одна из самых важных утилит. Она позволяет копировать файлы и папки, делая вашу работу проще и быстрее.

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

Что такое команда cp в Linux?

Команда cp (от английского “copy” — копировать) предназначена для копирования файлов и папок в системе Linux. Утилита cp очень полезна при создании резервных копий файлов, перемещении данных между папками или при подготовке файлов к обработке.

Основные особенности команды cp

  • Копирует файлы из одного места в другое.
  • Может копировать целые папки вместе с их содержимым.
  • Позволяет сохранять исходные атрибуты файлов.
  • Имеет множество опций для расширенного использования.

Как использовать команду cp? Простые примеры

Давайте рассмотрим базовые примеры использования команды 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

Команда 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, постарайтесь запомнить основные способы использования команды.

Когда освоитесь с базовыми опциями, подумайте, где в своей работе вы могли бы использовать остальные, более специфические опции, и начинайте применять их. Так вы быстрее освоите все преимущества данного инструмента.