Практические примеры использования cp

Nov 14, 2016 10:00 · 428 words · 3 minute read cp

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

Давайте разберемся с несколькими практическими примерами использования команды cp!

Синтаксис команды следующий:

cp [параметры] источник приемник

Скопировать файл из одного каталога в другой без изменения имени можно так:

cp ~/ansible/hosts ~/backup/

Изменить имя файла при копировании довольно просто:

cp ~/ansible/hosts ~/backup/hosts.old

Скопировать каталог со всем его содержимым можно с помощью опции -r, например:

cp -r ~/ansible/ ~/backup/

Скопировать несколько файлов, соответствующих некоторому шаблону тоже довольно просто:

cp *.yml ~/ansible/playbooks/ ~/backup/playbooks/

Используя опцию --backup при копировании вы не затрете существующий в каталоге-приемнике файл. Если файл с таким именем уже существует, то к его имени будет добавлен символ ~.

cp --backup ~/ansible/hosts ~/backup/
ls -l ~/backup/
-rw-r--r-- 1 admin staff 1020 Oct  8 13:36 hosts
-rw-r--r-- 1 admin staff 1038 Oct  8 13:15 hosts~

Конечно, можно такие файлы просто не копировать из источника в приемник, для этого следует использовать опцию -n:

cp -n ~/ansible/hosts ~/backup/hosts
ls -l ~/backup/
-rw-r--r-- 1 admin staff 1020 Oct  8 13:15 hosts

А еще разумнее использовать ‘интерактивный’ режим — за это отвечает опция -i:

cp -i ~/ansible/hosts ~/backup/
cp: overwrite `/home/admin/backup/hosts'? y

Если вы попробуете с помощью команды cp скопировать ссылку, указывающую на файл, то в результате будет скопирован сам файл. Чтобы копировать именно ссылки на файлы, следует воспользоваться опцией -d:

cp -d ~/speedtest ~/backup/
ls -l ~/backup/
lrwxrwxrwx 1 root    root      27 Oct  3 14:56 speedtest -> /usr/local/bin/speedtest.sh

Также можно вместо копирования файла создавать ‘жесткую’ ссылку на него с помощью -l. Делается это так:

cp -l convert.sh backup/

ls -li backup/convert.sh
2503465 -rwxr-xr-x 2 admin staff 246 Oct 10  2014 backup/convert.sh

А создание ‘мягкой’ ссылки с использованием опции -s выглядит так:

ls -la libsvn_ra_serf-1.so.1.0.0
-rw-r--r-- 1 root root 196608 Apr 26 15:34 libsvn_ra_serf-1.so.1.0.0
cp -s libsvn_ra_serf-1.so.1.0.0 libsvn.so
ls -la libsvn.so
lrwxrwxrwx 1 root root 25 Oct  3 16:58 libsvn.so -> libsvn_ra_serf-1.so.1.0.0

Сохранить атрибуты файла при копировании можно благодаря опции -p:

ls -la hosts
-rw-r--r-- 1 root root 28 Oct  3 16:42 hosts
cp -p ~/ansible/hosts ~/backup/
ls -la backup/hosts
-rw-r--r-- 1 root root 28 Oct  3 16:42 backup/hosts

Иногда требуется скопировать только файлы, версия которых в источнике более новая, чем в приемнике. Для этого используется опция -u (еще можно добавить опцию -v, чтобы видеть имена обновляемых файлов):

ls -la backup/hosts
-rw-r--r-- 1 root root 28 Oct  3 16:42 backup/hosts
cp -u -v ansible/* backup/
'ansible/hosts.bak' -> 'backup/hosts.bak'
ls -la backup/hosts*
-rw-r--r-- 1 root root 28 Oct  3 16:42 backup/hosts
-rw-r--r-- 1 root root 28 Oct  3 17:09 backup/hosts.bak
tweet Share