Безопасный rsync с прогрессом и исключениями
Команда rsync для безопасного копирования файлов с отображением прогресса, исключением файлов и проверкой перед выполнением.
Как использовать
- Сначала запусти с --dry-run: rsync -avh --progress --exclude='...' --dry-run source/ dest/. Проверь вывод.
- Убери --dry-run для реального копирования. Добавь --delete только если нужно удалять лишнее в назначении.
- Исключения: --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.
Проверка
-
Dry-run — запустите команду с —dry-run. В выводе должен быть список файлов «к отправке» без реального копирования. Убедитесь, что в списке нет node_modules, .git, .env (если они в exclude).
-
Исключения — временно уберите один —exclude и снова —dry-run; в списке должны появиться соответствующие файлы. Верните exclude обратно.
-
Реальный запуск — после проверки уберите —dry-run. Следите за прогрессом; при копировании на удалённый хост убедитесь, что SSH доступ настроен (пароль или ключ).
-
С —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 (пути при деплое).