linux files

cp

Копировать файлы и директории

Описание

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

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

В профессиональной работе cp используется для создания резервных копий перед изменениями, развёртывания конфигурационных файлов, клонирования шаблонов проектов и синхронизации файлов между каталогами. Для более сложных сценариев синхронизации обычно используют rsync.

Синтаксис

cp [ОПЦИИ] ИСТОЧНИК НАЗНАЧЕНИЕ cp [ОПЦИИ] ИСТОЧНИК... ДИРЕКТОРИЯ

При копировании нескольких источников последний аргумент должен быть директорией:

cp file1.txt file2.txt file3.txt target_directory/

Флаги и опции

Флаг Описание Пример
-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 -a вместо cp -r. Флаг -a гарантирует сохранение всех метаданных: прав доступа, владельца, временных меток и символических ссылок. Просто -r копирует только содержимое.
Совет: trailing slash имеет значение
cp -r src dst — если dst существует, создаёт dst/src/ (вложение).
cp -r src/ dst/ — копирует содержимое src прямо в dst (без вложения).
Поведение зависит от того, существует ли директория назначения на момент вызова.
Совет: для больших объёмов используйте rsync
cp копирует полностью при каждом запуске. Для синхронизации больших деревьев файлов предпочтительнее rsync -av — он копирует только изменения, показывает прогресс и поддерживает прерывание и возобновление.
Внимание: cp молча перезаписывает файлы
По умолчанию cp перезапишет существующий файл назначения без предупреждения. Добавьте алиас alias cp='cp -i' в ~/.bashrc для интерактивного режима в повседневной работе. В скриптах же лучше явно указывать поведение флагами -n или -i.
Внимание: символические ссылки без -a
cp -r по умолчанию разыменовывает символические ссылки и копирует содержимое файлов, на которые они указывают. Если нужно скопировать именно ссылку (не содержимое), используйте cp -a или cp -d (--no-dereference).