Команда cp: копирование файлов и папок с сохранением прав
Синтаксис cp, полезные ключи, копирование сайта вместе со скрытыми файлами и правами, защита от перезаписи и что делать, когда нужен прогресс. Ubuntu, Debian, AlmaLinux.

cp — стандартная команда копирования файлов и папок. Она есть в любом дистрибутиве, ставить ничего не нужно. Ниже — приёмы, которые нужны при работе с сервером: от резервной копии конфига перед правкой до переноса сайта с сохранением владельца и прав.
Если сервера ещё нет, VPS на tanaka.host создаётся за минуту с Ubuntu или Debian, а списание идёт по дням — удобно, чтобы просто попробовать.
Синтаксис
cp [ключи] источник назначение
Если назначение — существующая папка, файл попадёт в неё под тем же именем. Если такой папки нет, cp создаст копию с указанным именем.
1. Основные примеры
# Копируем файл в папку
cp config.yml /root/backup/
# Копия рядом под другим именем, например перед правкой конфига
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
# Несколько файлов в одну папку
cp file1.txt file2.txt /root/backup/
# Папку со всем содержимым
cp -r /var/www/site /root/backup/
2. Полезные ключи
| Ключ | Что делает |
|---|---|
-r |
Копирует папки целиком, со всем содержимым |
-a |
Режим архива: папки рекурсивно плюс права, владелец, даты и ссылки |
-p |
Сохраняет права, владельца и даты изменения |
-i |
Спрашивает перед перезаписью существующего файла |
-n |
Никогда не перезаписывает существующие файлы |
-u |
Копирует, только если источник новее или файла в назначении нет |
-b |
Перед перезаписью сохраняет старый файл с ~ в конце имени |
-v |
Печатает каждый скопированный файл |
3. Скопировать сайт с сохранением прав
Для сайтов и конфигов используйте -a. У копии сохранятся владелец, права и даты, и веб-сервер сможет работать с ней без дополнительной настройки.
# Содержимое папки сайта вместе со скрытыми файлами
cp -a /var/www/site/. /var/www/site-copy/
Скрытые файлы. Точка в конце пути
/var/www/site/.означает «всё содержимое папки», включая.htaccessи.env. Не используйте для этого шаблон.*— в старых версиях bash он захватывает и.., родительскую папку, иcpскопирует намного больше, чем вы хотели.
4. Не перезаписать нужное
# Спрашивать перед каждой перезаписью
cp -i new.conf /etc/app/app.conf
# Не трогать существующие файлы, добавить только недостающие
cp -rn /root/backup/site/. /var/www/site/
# Перезаписать, но сохранить старую версию как app.conf~
cp -b new.conf /etc/app/app.conf
5. Скопировать только изменённое
# Обновляем копию: переносятся только новые и изменённые файлы
cp -au /var/www/site/. /root/backup/site/
Для регулярных копий и больших папок удобнее rsync: он делает то же самое, передаёт только изменённые блоки и показывает прогресс.
Прогресс копирования
У cp индикатора нет, -v только печатает имена. Для больших объёмов — rsync:
sudo apt install -y rsync
rsync -a --info=progress2 /var/www/site/ /root/backup/site/
Между серверами — scp или тот же rsync, примеры в статье о резервных копиях VPS.
Частые ошибки
-r not specified; omitting directory. Папка без -r. Добавьте -r или -a: cp -a /var/www/site /root/backup/.
No space left on device. Диск кончился. df -h покажет, сколько есть; удалите лишнее или возьмите тариф с большим диском. Частично скопированный файл в назначении лучше удалить.
Permission denied. Нет прав на чтение источника или запись в назначение. Через sudo, либо проверьте права ls -l — подробнее в статье про chmod и chown.
Можно ли прервать. Ctrl+C. Скопированное останется, последний файл может оказаться неполным. Докопировать — та же команда с -u или rsync.
После копирования сайт перестал работать. У копии сменился владелец, потому что копировали без -a. Верните его: chown -R www-data:www-data /var/www/site-copy на Ubuntu и Debian (на AlmaLinux — nginx или apache), либо скопируйте заново с -a.