
Каждый, кто хочет работать с командной строкой в одном из многочисленных дистрибутивов с открытым исходным кодом, основанных на Linux, должен ознакомиться с множеством команд Linux. Они позволяют перемещаться по структуре папок, редактировать данные или копировать файлы и каталоги. Команда CP (сокращение от «copy») позволяет создавать копии выбранных файлов или целых папок.
Зачем нужна команда CP в Linux?
Копирование файлов и папок является одной из основ любой операционной системы и выполняется большинством пользователей ежедневно. Копии используются для обмена файлами с другими людьми или для их резервного копирования. Обычно этот инструмент является неизменной (и уже установленной) частью каждой установки Linux — независимо от того, какой дистрибутив вы используете. CP принадлежит к пакету GNU Core Utilities (сокращенно: «coreutils»). Этот пакет с наиболее важными инструментами доступен для свободного использования.
Синтаксис в Linux CP
Основная функция CP проста: скопировать один или несколько файлов в указанное пользователем место. Для этого важны две части информации: имя объекта и место назначения действия. Синтаксис CP построен следующим образом:
cp [Original] [Destination]
Для этого перейдите в каталог файла, который необходимо скопировать, а затем укажите в команде имя файла и путь, по которому должен быть сохранен новый файл.
cp text.txt /home/user/destinationfolder/
В этом примере мы создаем новый файл в папке назначения с тем же именем, что и исходный файл. Если вы хотите скопировать сразу несколько файлов, перечислите их один за другим в одной командной строке.
cp text1.txt text2.txt text3.txt /home/user/destinationfolder/
В предыдущих примерах мы всегда давали копии то же имя, что и исходному файлу. Вы можете произвольно задать имя файла, указав его в параметре назначения:
cp text.txt /home/user/destinationfolder/text_copy.txt
Если вы опустите путь к папке назначения, копия будет создана с новым именем файла в той же папке, что и исходный файл.
cp text1.txt text2.txt
Специальные функции CP
Команда Linux CP может похвастаться еще большим количеством функций. Для этого вы используете поле опций:
cp [Option(s)] [Original(s)] [Destination]
В поле можно ввести следующие параметры (флаги), чтобы сделать работу по копированию более объемной или более простой.
Параметр | Описание | Пример |
---|---|---|
-a | Копирует файл с теми же параметрами разрешения и метаданными, что и оригинал. | cp -a text.txt /home/user/destinationfolder/ |
—archive | Копирует файл с теми же параметрами разрешения и метаданными, что и оригинал. | cp —archive text.txt /home/user/destinationfolder/ |
-b | Создает копию в буфере, если оригинал и место назначения имеют одинаковое имя файла, но разное содержимое. | cp -b text.txt /home/user/destinationfolder/ |
—backup | Создает копию в буфере, если исходный и конечный файлы имеют одинаковое имя, но разное содержимое. | cp —backup text.txt /home/user/destinationfolder/ |
—backup=numbered | Создает новый нумерованный файл, если исходный и конечный файлы имеют одинаковое имя, но разное содержимое. | cp —backup==numbered text.txt /home/user/destinationfolder/ |
—backup=existing | Создает новый пронумерованный файл, если исходный и конечный файлы имеют одинаковое имя, но разное содержимое, и уже есть пронумерованные резервные копии. | cp —backup==existing text.txt /home/user/destinationfolder/ |
-d | Копирует символические ссылки. | cp -d text.txt /home/user/destinationfolder/ |
-f | Принудительная перезапись при копировании. | cp -f text.txt /home/user/destinationfolder/text.txt |
—force | Принудительная перезапись при копировании. | cp —force text.txt /home/user/destinationfolder/text.txt |
-i | Запрашивает разрешение перед перезаписью одноименных файлов. | cp -i text.txt /home/user/destinationfolder/ |
-интерактивный | Запрашивает разрешение перед перезаписью файлов с тем же именем. | cp —interactive text.txt /home/user/destinationfolder/ |
-l | Создает жесткую ссылку вместо копии. | cp -l text.txt /home/user/destinationfolder/ |
—link | Создает жесткую ссылку вместо копии. | cp —link text.txt /home/user/destinationfolder/ |
-n | Существующие файлы никогда не перезаписываются. | cp -n text.txt /home/user/destinationfolder/ |
—no-cobbler | Существующие файлы никогда не перезаписываются. | cp -no-cobbler text.txt /home/user/destinationfolder/ |
-p | При копировании наследуются атрибуты исходного файла. | cp -p text.txt text1.txt |
—preserve | Атрибуты исходного файла наследуются при копировании. | cp —preserve text.txt text1.txt |
—preserve=mode | Режим исходного файла наследуется при копировании. | cp —preserve==mode text.txt text1.txt |
—preserve=ownership | При копировании наследуется право собственности исходного файла. | cp —preserve==ownership text.txt text1.txt |
—preserve=timestamp | Временная метка исходного файла наследуется при копировании. | cp —preserve==timestamp text.txt text1.txt |
—preserve=links | При копировании наследуются ссылки исходного файла. | cp —preserve==links text.txt text1.txt |
—preserve=context | При копировании наследуется контекст безопасности исходного файла. | cp —preserve==context text.txt text1.txt |
—preserve=xattr | При копировании наследуются расширенные атрибуты исходного файла. | cp —preserve==xattr text.txt text1.txt |
—preserve=all | При копировании наследуются все атрибуты исходного файла. | cp —preserve==all text.txt text1.txt |
-P | Символьные ссылки сохраняются как таковые. | cp -P text.txt /home/user/destinationfolder/ |
—no-dereference | Символьные ссылки сохраняются как таковые. | cp —no-dereference text.txt /home/user/destinationfolder/. |
-r | Каталоги копируются рекурсивно, включая подкаталоги. | cp -r /home/user/originalfolder/ /home/user/destinationfolder/ |
-R | Каталоги копируются рекурсивно, включая подкаталоги. | cp -R /home/user/originalfolder/ /home/user/destinationfolder/ |
—recursive | Каталоги копируются рекурсивно, включая подкаталоги. | cp —recursive /home/user/originalfolder/ /home/user/destinationfolder/ |
-s | Создает символическую ссылку на исходный файл. | cp -s text.txt /home/user/destinationfolder/ |
-символическая ссылка | Создает символическую ссылку на исходный файл. | cp —symbolic-link text.txt /home/user/destinationfolder/ |
-S | Перезаписывает суффикс резервной копии при копировании с помощью —backup. | cp —backup=simple -S text.txt /home/user/destinationfolder/ |
-суффикс=собственный_суффикс | Перезаписывает суффикс резервной копии своим собственным суффиксом при копировании с помощью —backup. | cp —backup=simple -suffix=own_suffix text.txt /home/user/destinationfolder/ |
-u | Копирует файл, только если файл назначения старше оригинала. | cp -u text.txt /home/user/destinationfolder/text.txt |
—update | Копирует файл, только если файл назначения старше оригинала. | cp —update text.txt /home/user/destinationfolder/text.txt |
-v | Выводит сообщение после завершения операции копирования. | cp -v text.txt text1.txt |
—verbose | Выводит сообщение после операции копирования. | cp —verbose text.txt text1.txt |
Вы также можете комбинировать многие из этих параметров. Для этого в поле команды напишите параметры и отделите их пробелом.
Примеры применения CP на практике
Из большого количества опций, доступных для команды copy, видно, что CP в Linux можно использовать не только для простого копирования файлов и папок. Комбинируя различные параметры, вы можете управлять крупномасштабными задачами. Следующие три примера соответствуют типичным сценариям использования в повседневной жизни пользователя Linux.
Нумерованное резервное копирование
Предположим, что вы работаете над файлом и хотите регулярно создавать его резервную копию. Для того чтобы вы могли также отслеживать изменения и, возможно, вернуться к более старому состоянию, создаются отдельные файлы. Для этого мы используем опцию расширенного резервного копирования.
cp -f -v --backup=numbered text.txt text.txt
Мы создадим эту резервную копию под тем же именем файла, а также в той же папке. Чтобы это стало возможным, используем опцию «принудительно». Поскольку мы дополнительно активировали опцию «нумерованный», новые файлы с пронумерованными именами файлов все равно будут в каждом случае. Благодаря опции «verbose» вы получаете уведомление после каждой операции копирования.
В консоли это выглядит следующим образом:
~$ cp -v -f --backup=numbered text.txt text.txt
'text.txt' -> 'text.txt.~1~'
~$ cp -v -f --backup=numbered text.txt text.txt
'text.txt' -> 'text.txt.~2~'
~$ cp -v -f --backup=numbered text.txt text.txt
'text.txt' -> 'text.txt.~3~'
~$ ls
text.txt text.txt.~1~ text.txt.~2~ text.txt.~3~
В Linux вы можете использовать команду «ls» для отображения списка файлов и подпапок, существующих в папке.
Сортировка файлов с помощью подстановочных знаков
У вас есть папка, набитая файлами: картинки, документы и приложения хранятся в беспорядке. Предположим, что вы хотите скопировать все изображения в одну папку. Вместо того чтобы вводить в команду все изображения по отдельности, мы используем звездочку (*), которая действует как подстановочный знак. В нашем примере мы заменяем полное имя файла звездочкой и указываем только расширения файлов.
cp *.jpg *.png /home/user/pictures
Эта команда копирует все файлы с расширениями JPG и PNG в папку images. Все остальные форматы файлов игнорируются. Оригинальные файлы остаются, поскольку вы копируете только данные с CP, а не перемещаете их.
Копирование каталогов
Рекурсивное копирование включает папку вместе с ее вложенными папками. Таким образом, в этом случае переносится структура каталогов. Это не работает при простом копировании с помощью CP: если вы попытаетесь скопировать папку без ее каталогов, вы получите только сообщение об ошибке. Вместо этого нужно установить параметр «-r» или «-recursive» или «-R».
В нашем примере мы хотим регулярно делать резервную копию папки, включая ее содержимое и вложенные папки. Чтобы не копировать все каждый раз, мы дополнительно используем функцию «update».
cp -r -u /home/user/Original/ /home/user/Backups/
При первом запуске команды внутри папки резервного копирования создается каталог «Original». В него копируются все файлы и подкаталоги. При больших объемах данных это может занять некоторое время. При использовании опции «-u» вы всегда будете копировать только измененные данные.
Альтернативы Linux CP
Несмотря на многочисленные возможности CP, команда может быть использована только в относительно ограниченных пределах. Например, если вы хотите создать копию, а затем удалить оригинал, вам придется прибегнуть к команде MV (move). В этой команде вы также вводите исходный объект и путь назначения.
Немного более сложной, чем CP, является команда DD. С ее помощью вы имеете дополнительную возможность изменить формат данных в процессе копирования. Для этого процесс происходит бит за битом. Команда подходит, например, для копирования жестких дисков или разделов целиком.
Интересна также команда Linux PYCP. С ее помощью вы получаете графическое отображение хода процесса копирования. Однако для этого вам потребуется Python 3.5 (или более новая версия). В новых версиях Ubuntu этот язык программирования предустановлен по умолчанию.
Команда Linux SCP также может быть полезной. С помощью Secure Copy вы можете передавать данные с одного локального компьютера на другой или наоборот. Это делается через SSH и поэтому является зашифрованной операцией.
С помощью Linux CP вы можете быстро и относительно легко копировать файлы и папки. Имея под рукой множество опций, можно выполнять и более сложные задачи. Для выполнения обычных задач вы также можете легко поместить команду в сценарии оболочки. Таким образом, вы можете написать себе сценарий, например, для еженедельного резервного копирования.
Для ежедневного использования терминала Linux полезно ознакомиться с некоторыми другими командами. Например, узнайте больше об этих командах, чтобы упростить рабочий процесс:
- Команда Linux SED: Простой текстовый редактор.
- Команда Linux Tail: Отображает последние строки файла.
- Команда Linux head: Отображает первые строки файла.
- Команда Linux CAT: Отображает содержимое файла.