Практические примеры использования cp
Nov 14, 2016 10:00 · 428 words · 3 minute read
Команда 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