У вас хоть одна пользовательская сессия проходит без копирования файлов?) В общем-то для этого мы и используем команду cp, в которой немало полезных опций.
Начнем с простого. Для копирования файлов команда имеет 2 типа синтаксиса:
1) с сохранением названия - с указанием каталога;
$ cp ./src/file ./dest/
2) без сохранения - с указанием нового имени файла;
$ cp ./src/file ./dest/file_backup
Сразу же скину ссылку на полную информацию о команде. Далее мы рассмотрим основные кейсы.
Копирование каталога
Для копирования каталогов нужно использовать опцию "-r":
$ cp -r source destination
$ ls destination
source
Тут ме переносим весь каталог вместе с его наполнением.
Если нет полной уверенности в том, что каталог "dest" существует, можно добавить флаг "-t" для вывода предупреждения:
$ cp -rt src dest3
cp: cannot stat 'dest3': No such file or directory
Копирование в этом случае выполнено не будет и каталог не будет создан.
Копирование содержимого каталога
Для того, чтобы перенести только содержимое директории, а не ее саму, используем:
$ cp -r src no_dest
$ ls no_dest
file1 file2 file3
Но есть нюансик... Это так работает только, если no_dest ранее не существовал. Если каталог назначения существует, то в нем будет создан src.
Для того чтобы избежать такого поведения можно использовать опцию "-T":
$ cp -rT src yes_dest
ls yes_dest
file1 file2 file3
Как вариант, еще можно решить задачу использованием шаблона поиска:
$ cp src/* dest
Однако в этом случае скрытые файлы скопированы не будут. Ну и это не проблема особо:
$ cp src/* src/.* dest
Обработка существующих файлов
По умолчанию, если файл каталоге назначения уже существует, он будет перезаписан. Если вы хотите, чтобы утилита спросила вас, стоит ли его перезаписывать, используйте флаг "-i":
$ cp -i src/* dest
cp: overwrite 'dest/file1'? y
cp: overwrite 'dest/file2'? y
С помощью опции "-n" можно отключить перезапись существующих ресурсов:
$ cp -n file1 dest
Создание бэкапов
Для существующих файлов можно cделать резервную копию с помощью опции "-b". Если использовать этот флаг, то в конце названия файла резервной копии будет добавлен символ тильды "~":
$ cp -b file1 dest
$ ls dest
file1~
При использовании параметра "--backup" можно настроить имя резервной копии. Вот доступные варианты:
1) none - резервная копия не делается;
2) numbered - к имени файла будет добавляться номер;
3) simple - в конец файла будет добавлен знак "~";
4) existing - если в целевой директории уже есть бэкапы, то будет использоваться аналогичный им тип нейминга;
Чтобы использовать номер в имени бэкапа используйте:
$ cp --backup=numbered file1 dest
$ ls dest
file1.~1~
Ещё один вариант обработки существующих файлов - заменять только, если изначальный новее.
Для этого нужно использовать опцию "-u":
$ cp -u file1 dest
Копирование ссылок
По умолчанию жесткие и символические ссылки копируются как обычные файлы, сохраняя содержимое ресурса, к которому были подвязаны:
$ cp test_link links
$ ls -l links
-rw-rw-r-- 1 ... test_link
Если вы хотите, чтобы символические ссылки копировались, сохраняя свой тип, нужно использовать опцию "-P":
$ cp test_link links
$ ls -l links
lrwxrwxrwx 1 ... test2_link -> test2
Ток, пожалуйста, не забывайте проверять путь к оригиналу на корректность - в примере выше ссылка поломана.
Для жестких ссылок существует другой подход. Если вы хотите, чтобы она осталась собой после копирования, нужно использовать опцию "-l":
$ cp -l hlink hlink1
$ ls -l
-rw-rw-r-- 3 ... file
-rw-rw-r-- 3 ... hlink
-rw-rw-r-- 3 ... hlink1
Сохранение атрибутов
По умолчанию cp обновляет временные метки и атрибуты прав доступа файлов при копировании.
Иногда может возникнуть необходимость их сохранить. Для этого используем "--preserve":
$ cp --preserve=all file dest
LinuxCamp | #utils
