cp (от английского copy) – стандартная команда Linux для копирования файлов и папок. Она есть в любом дистрибутиве, поэтому ничего устанавливать не нужно.
Ниже разберём основные приёмы, которые пригодятся при работе с сервером, от копирования одного файла до переноса сайта с сохранением прав. Примеры проверены на Debian 12, на Ubuntu и других дистрибутивах с GNU coreutils они работают так же.
Синтаксис
cp [ключи] источник назначениеЕсли назначение – существующая папка, файл скопируется в неё под тем же именем. Если такой папки нет, cp создаст копию с указанным именем.
Основные примеры
# Копируем файл в папку
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/Полезные ключи
| Ключ | Что делает |
|---|---|
-r | Копирует папки целиком, со всем содержимым |
-a | Режим архива. Копирует папки и сохраняет права, владельца, даты и ссылки |
-p | Сохраняет права, владельца и даты изменения у копии |
-i | Спрашивает разрешения, прежде чем перезаписать существующий файл |
-n | Никогда не перезаписывает существующие файлы |
-u | Копирует, только если источник новее или файла в назначении ещё нет |
-b | Перед перезаписью сохраняет старый файл с тильдой в конце имени |
-v | Печатает каждый скопированный файл |
Скопировать сайт с сохранением прав
Для переноса сайтов и настроек используйте -a. Так у копии сохранятся владелец, права доступа и даты, а веб-сервер сможет работать с файлами без дополнительной настройки.
# Копируем содержимое папки сайта вместе со скрытыми файлами
cp -a /var/www/site/. /var/www/site-copy/Как скопировать скрытые файлы
Точка в конце пути /var/www/site/. означает «всё содержимое папки», включая скрытые файлы вроде .htaccess и .env. Не используйте для этого шаблон .*. В старых версиях bash он захватывает и .., то есть родительскую папку, и cp скопирует намного больше, чем нужно.
Не перезаписать нужные файлы
# Спрашивать перед перезаписью каждого файла
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Скопировать только изменённые файлы
# Обновляем копию: переносятся только новые и изменённые файлы
cp -au /var/www/site/. /root/backup/site/Для регулярных копий и больших папок удобнее rsync, он умеет то же самое и показывает прогресс.
Как увидеть прогресс копирования
У cp нет индикатора прогресса, а ключ -v только печатает имена файлов. Для больших файлов и папок используйте rsync.
# Устанавливаем rsync, если его ещё нет
apt install -y rsync
# Копируем папку с общим индикатором прогресса
rsync -a --info=progress2 /var/www/site/ /root/backup/site/Копировать файлы между серверами удобно через scp или rsync, примеры есть в статье о резервных копиях.
Частые вопросы
Ошибка «-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.
Можно ли прервать копирование?
Да, нажмите Ctrl + C. Уже скопированные файлы останутся на месте, а последний файл может оказаться скопирован не полностью. Чтобы потом докопировать остальное, запустите команду заново с ключом -u или используйте rsync.
После копирования сайт перестал работать
Скорее всего, у копии сменился владелец, потому что вы копировали без ключа -a. Верните владельца командой chown -R www-data:www-data /var/www/site-copy на Ubuntu и Debian или скопируйте папку заново с -a.
Наши ресурсы
Telegram-канал: https://t.me/f3cloud_news
Сайт хостинга: https://f3cloud.com