Сниппеты
Назад к сниппетам

Безопасный rsync с прогрессом и исключениями

Команда rsync для безопасного копирования файлов с отображением прогресса, исключением файлов и проверкой перед выполнением.

bash
4 января 2026 г.

Копирование каталога через rsync без исключений тянет node_modules, .git, логи, .env — долго и рискованно. Нужен прогресс, исключение лишнего и проверка списка файлов до реального запуска. Проблема: первый запуск без --dry-run может залить лишнее или перезаписать важное в назначении. Симптомы: долгий rsync, переполнение диска, случайная перезапись. Ниже — команда с -avh, --progress, --exclude и --dry-run; проверка и когда добавлять --delete по документации rsync.

Решение

Безопасная команда rsync с прогрессом, исключениями и опцией dry-run для проверки перед копированием.

rsync -avh --progress \
  --exclude='node_modules' \
  --exclude='.git' \
  --exclude='*.log' \
  --exclude='.env' \
  --exclude='vendor' \
  --dry-run \
  /source/path/ user@host:/destination/path/
  • -a — архивный режим (права, владелец, время).
  • -v — подробный вывод.
  • -h — размеры в человекочитаемом виде.
  • --progress — прогресс по каждому файлу.
  • --exclude — исключение по паттерну (можно несколько).
  • --dry-run — только показать, что будет скопировано, без записи.

Реальное копирование — уберите --dry-run:

rsync -avh --progress \
  --exclude='node_modules' \
  --exclude='.git' \
  --exclude='.env' \
  /source/path/ user@host:/destination/path/

Синхронизация (удалять лишнее в назначении) — добавьте --delete (осторожно: удалит в destination то, чего нет в source):

rsync -avh --progress --delete \
  --exclude='node_modules' \
  /source/path/ user@host:/destination/path/

Сначала всегда проверяйте с --dry-run.

Проверка
  1. Dry-run — запустите команду с --dry-run. В выводе должен быть список файлов «к отправке» без реального копирования. Убедитесь, что в списке нет node_modules, .git, .env (если они в exclude).
  1. Исключения — временно уберите один --exclude и снова --dry-run; в списке должны появиться соответствующие файлы. Верните exclude обратно.
  1. Реальный запуск — после проверки уберите --dry-run. Следите за прогрессом; при копировании на удалённый хост убедитесь, что SSH доступ настроен (пароль или ключ).
  1. С --delete — перед первым использованием --delete обязательно сделайте dry-run: иначе можно удалить в destination нужные файлы, которых нет в source.
Типичные ошибки
  • Забыли завершающий слэш в source — путь source/ (со слэшем) копирует содержимое каталога; source без слэша создаст подкаталог source в назначении. Обычно нужен слэш: /source/path/.
  • --delete без dry-run — удаляет в destination всё, чего нет в source. Сначала всегда проверяйте с --dry-run и без --delete, затем при необходимости добавляйте --delete и снова dry-run.
  • Копирование .env и секретов — без --exclude='.env' и подобных секреты попадут на другой хост. Добавьте исключения под свой проект (vendor, .env.local, *.key и т.д.).
  • Права и владелец — -a сохраняет права; на другом сервере владелец может не существовать. При необходимости используйте --no-owner --no-group или настройте пользователя на целевом хосте.
Где применять
  • Бэкапы и деплой: копирование проекта на сервер, синхронизация каталогов без лишних данных. Dev → staging, локальная копия на удалённый хост.
  • Локально: копирование между дисками с исключением кэшей и тяжёлых каталогов. Всегда начинайте с --dry-run.

Связанные сниппеты: Анализ логов nginx (логи лучше не копировать без необходимости), Структура каталогов nginx (пути при деплое).