BASH
#bash#rsync#backup#sync#linux

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

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

Как использовать

  1. Сначала запусти с --dry-run: rsync -avh --progress --exclude='...' --dry-run source/ dest/. Проверь вывод.
  2. Убери --dry-run для реального копирования. Добавь --delete только если нужно удалять лишнее в назначении.
  3. Исключения: --exclude='node_modules' --exclude='.git' --exclude='*.log' --exclude='.env' и т.д.

Копирование каталога через 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).

  2. Исключения — временно уберите один —exclude и снова —dry-run; в списке должны появиться соответствующие файлы. Верните exclude обратно.

  3. Реальный запуск — после проверки уберите —dry-run. Следите за прогрессом; при копировании на удалённый хост убедитесь, что SSH доступ настроен (пароль или ключ).

  4. С —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 (пути при деплое).