cp
Копировать файлы и директории
Описание
cp (от copy) — стандартная утилита для копирования файлов и директорий в Unix/Linux.
Команда читает содержимое исходного файла и записывает его по указанному пути назначения, создавая
независимую копию данных. Оригинальный файл остаётся неизменным.
Команда поддерживает три основных режима: копирование одного файла в другой файл, копирование одного или
нескольких файлов в директорию, и рекурсивное копирование директорий вместе с содержимым. Флаг
-r (или -R) является обязательным при копировании директорий — без него
cp откажется копировать каталог.
В профессиональной работе cp используется для создания резервных копий перед изменениями,
развёртывания конфигурационных файлов, клонирования шаблонов проектов и синхронизации файлов между
каталогами. Для более сложных сценариев синхронизации обычно используют rsync.
Синтаксис
- ИСТОЧНИК — файл или директория для копирования
- НАЗНАЧЕНИЕ — путь к копии (файл) или директория, куда помещается копия
- Если НАЗНАЧЕНИЕ — существующая директория, файл помещается внутрь с исходным именем
- Если НАЗНАЧЕНИЕ — несуществующий путь, создаётся файл с таким именем
При копировании нескольких источников последний аргумент должен быть директорией:
Флаги и опции
| Флаг | Описание | Пример |
|---|---|---|
-r, -R, --recursive |
Рекурсивно копировать директории вместе со всем содержимым | cp -r src/ backup/ |
-i, --interactive |
Запрашивать подтверждение перед перезаписью существующего файла | cp -i file.txt dest/ |
-n, --no-clobber |
Не перезаписывать существующие файлы назначения | cp -n *.txt archive/ |
-u, --update |
Копировать только если источник новее назначения или назначение отсутствует | cp -u src/* dst/ |
-v, --verbose |
Выводить имена копируемых файлов | cp -rv src/ dst/ |
-a, --archive |
Режим архивирования: рекурсия + сохранение прав, меток времени, символических ссылок (эквивалент -dR --preserve=all) |
cp -a /etc/nginx/ backup/ |
-p, --preserve |
Сохранить атрибуты: режим, владелец, метки времени | cp -p config.conf backup/ |
-l, --link |
Создавать жёсткие ссылки вместо копий | cp -l src.txt link.txt |
-s, --symbolic-link |
Создавать символические ссылки вместо копий | cp -s /abs/path/file link |
-f, --force |
Удалять файл назначения и пробовать снова, если не удаётся открыть на запись | cp -f src.txt readonly_dest.txt |
--backup[=CONTROL] |
Создать резервную копию каждого существующего файла назначения | cp --backup=numbered f.txt dest/ |
-T, --no-target-directory |
Рассматривать НАЗНАЧЕНИЕ как обычный файл, даже если это директория | cp -T src dir_as_file |
Паттерны использования
Скопировать файл с новым именем
cp report.txt report_backup.txt
Создаёт копию report.txt под именем report_backup.txt в том же каталоге.
Скопировать файл в директорию
cp config.yaml /etc/myapp/ cp *.log /var/log/archive/
Файл копируется в указанную директорию с сохранением исходного имени. Glob-шаблоны позволяют скопировать несколько файлов.
Рекурсивное копирование директории
cp -r myproject/ myproject_backup/ cp -rv /var/www/html/ /backup/www/
Флаг -r обязателен для директорий. -v показывает прогресс при большом объёме.
Архивное копирование с сохранением атрибутов
# Сохранить права, владельца, метки времени cp -a /etc/nginx/ /backup/nginx/ cp -a /home/user/ /backup/home_user/
Флаг -a идеален для резервного копирования: сохраняются все атрибуты, включая символические ссылки и права доступа.
Безопасное копирование без перезаписи
# Спрашивать перед перезаписью cp -i *.conf /etc/app/ # Никогда не перезаписывать cp -n template/* project/
-i — интерактивный режим, -n — полный запрет перезаписи. Используйте в скриптах, где перезапись нежелательна.
Скопировать только обновлённые файлы
cp -u src/* dst/ # Или с рекурсией: cp -ru src/ dst/
Флаг -u копирует файл только если источник новее назначения. Удобно для инкрементального обновления директорий.
Советы и предупреждения
Для создания резервных копий всегда используйте
cp -a вместо cp -r.
Флаг -a гарантирует сохранение всех метаданных: прав доступа, владельца, временных меток
и символических ссылок. Просто -r копирует только содержимое.
cp -r src dst — если dst существует, создаёт dst/src/ (вложение).cp -r src/ dst/ — копирует содержимое src прямо в dst (без вложения).Поведение зависит от того, существует ли директория назначения на момент вызова.
cp копирует полностью при каждом запуске. Для синхронизации больших деревьев файлов
предпочтительнее rsync -av — он копирует только изменения, показывает прогресс
и поддерживает прерывание и возобновление.
По умолчанию
cp перезапишет существующий файл назначения без предупреждения.
Добавьте алиас alias cp='cp -i' в ~/.bashrc для интерактивного режима
в повседневной работе. В скриптах же лучше явно указывать поведение флагами -n или -i.
cp -r по умолчанию разыменовывает символические ссылки и копирует содержимое файлов, на
которые они указывают. Если нужно скопировать именно ссылку (не содержимое), используйте cp -a
или cp -d (--no-dereference).