Rsync

Rsync — утилита для быстрого копирования и синхронизации файлов и каталогов. Она умеет передавать только изменившиеся данные, сохранять метаданные, работать через SSH и удалять файлы, отсутствующие в источнике.

Содержание

Синтаксис

rsync [ОПЦИИ] ИСТОЧНИК НАЗНАЧЕНИЕ

Локальное копирование:

rsync [ОПЦИИ] /путь/к/источнику/ /путь/к/назначению/

Копирование на удалённый сервер:

rsync [ОПЦИИ] /локальный/путь/ user@host:/удалённый/путь/

Копирование с удалённого сервера:

rsync [ОПЦИИ] user@host:/удалённый/путь/ /локальный/путь/

Основные параметры

Параметр Назначение
-a, --archive Архивный режим: рекурсивное копирование с сохранением большинства метаданных
-r, --recursive Рекурсивное копирование каталогов
-v, --verbose Подробный вывод
-q, --quiet Минимальный вывод
-h, --human-readable Размеры в удобном для чтения формате
-z, --compress Сжатие данных при передаче
-P Эквивалент --partial --progress
--progress Показывать ход передачи
--info=progress2 Показывать общий прогресс операции
-n, --dry-run Пробный запуск без изменения файлов
-c, --checksum Сравнивать файлы по контрольной сумме
-u, --update Не перезаписывать более новые файлы в назначении
--delete Удалять в назначении файлы, которых нет в источнике
--exclude=ШАБЛОН Исключить файлы или каталоги
--include=ШАБЛОН Включить файлы по шаблону
--exclude-from=ФАЙЛ Читать исключения из файла
-e КОМАНДА Указать транспорт, обычно SSH
-L, --copy-links Копировать содержимое, на которое указывают символические ссылки
--backup Создавать резервные копии заменяемых и удаляемых файлов
--backup-dir=КАТАЛОГ Сохранять резервные копии в отдельном каталоге
--remove-source-files Удалять исходные файлы после успешной передачи
--max-size=РАЗМЕР Не передавать файлы больше указанного размера
--min-size=РАЗМЕР Не передавать файлы меньше указанного размера
--bwlimit=СКОРОСТЬ Ограничить скорость передачи
--stats Показать статистику после завершения
--itemize-changes Подробно показать типы изменений

Архивный режим

Параметр -a примерно соответствует комбинации:

-rlptgoD

Он включает:

Архивный режим не включает сохранение ACL, расширенных атрибутов и жёстких ссылок. При необходимости используются:

rsync -aAXH источник/ назначение/

Где:

Завершающий слеш

Завершающий / у источника имеет важное значение.

Скопировать содержимое каталога source:

rsync -a source/ destination/

Результат:

destination/file1
destination/file2

Скопировать сам каталог source:

rsync -a source destination/

Результат:

destination/source/file1
destination/source/file2

Базовые примеры

Локальное копирование

rsync -avh /home/user/documents/ /backup/documents/

Копирование с отображением общего прогресса

rsync -ah --info=progress2 /data/ /backup/data/

Копирование на сервер через SSH

rsync -avz /local/data/ user@example.com:/remote/data/

Загрузка данных с сервера

rsync -avz user@example.com:/remote/data/ /local/data/

Использование нестандартного SSH-порта

rsync -avz -e "ssh -p 2222" /local/data/ user@example.com:/remote/data/

Использование SSH-ключа

rsync -avz -e "ssh -i ~/.ssh/backup_key" \
  /local/data/ user@example.com:/remote/data/

Зеркальная синхронизация

Чтобы назначение стало зеркальной копией источника:

rsync -avh --delete /source/ /destination/

Осторожно: --delete удаляет из назначения файлы, которых нет в источнике. Перед запуском рекомендуется проверить команду с --dry-run.

Проверка:

rsync -avhn --delete /source/ /destination/

Если результат ожидаемый, выполните команду без -n:

rsync -avh --delete /source/ /destination/

Варианты удаления:

Параметр Поведение
--delete-before Удалять лишние файлы до передачи
--delete-during Удалять в процессе передачи
--delete-after Удалять после передачи
--delete-excluded Удалять также файлы, исключённые фильтрами
--max-delete=N Удалить не более N файлов

Исключение файлов

Исключить один каталог:

rsync -av --exclude='cache/' /source/ /destination/

Исключить несколько типов файлов:

rsync -av \
  --exclude='*.tmp' \
  --exclude='*.log' \
  --exclude='.git/' \
  /source/ /destination/

Использовать файл с исключениями:

rsync -av --exclude-from='exclude.txt' /source/ /destination/

Пример exclude.txt:

*.tmp
*.log
.cache/
node_modules/
.git/

Правила шаблонов

*.log          Все файлы с расширением .log
cache/         Каталоги с именем cache
/cache/        Каталог cache в корне источника
temp/**        Всё содержимое каталога temp
file?.txt      Например file1.txt или fileA.txt

Копирование только определённых файлов

Скопировать только файлы .jpg, сохранив структуру каталогов:

rsync -av \
  --include='*/' \
  --include='*.jpg' \
  --exclude='*' \
  /photos/ /backup/photos/

Порядок правил --include и --exclude важен: применяется первое совпавшее правило.

Возобновление прерванной передачи

Сохранить частично переданные файлы и показывать прогресс:

rsync -avP /large-files/ user@host:/backup/

Хранить временные части файлов в отдельном каталоге:

rsync -av \
  --partial \
  --partial-dir='.rsync-partial' \
  /large-files/ user@host:/backup/

Для больших файлов, изменяемых внутри, можно использовать:

rsync -av --inplace /source/ /destination/

--inplace записывает изменения прямо в существующий файл. Этот режим требует осторожности: при прерывании операции файл назначения может оказаться неполным.

Резервное копирование изменённых файлов

Сохранять заменяемые и удаляемые файлы в отдельном каталоге:

rsync -av --delete \
  --backup \
  --backup-dir="/backup/changed/$(date +%F)" \
  /source/ /backup/current/

Структура будет выглядеть примерно так:

/backup/current/             Текущая копия
/backup/changed/2026-09-10/  Предыдущие версии изменённых файлов

Ограничение размера и скорости

Не копировать файлы больше 500 МБ:

rsync -av --max-size=500M /source/ /destination/

Копировать только файлы размером от 1 МБ:

rsync -av --min-size=1M /source/ /destination/

Ограничить скорость примерно до 5 МБ/с:

rsync -av --bwlimit=5M /source/ user@host:/destination/

Поддерживаемые суффиксы размеров включают K, M, G и T. Точное толкование единиц может зависеть от версии rsync.

Права доступа и владельцы

Сохранить стандартные метаданные:

rsync -a /source/ /destination/

Если команда выполняется без прав суперпользователя, сохранить владельца или некоторые специальные файлы может быть невозможно.

Не переносить владельца и группу:

rsync -a --no-owner --no-group /source/ /destination/

Назначить владельца и группу на принимающей стороне:

sudo rsync -a --chown=www-data:www-data /source/ /var/www/site/

Изменить права при копировании:

rsync -a \
  --chmod=Du=rwx,Dgo=rx,Fu=rw,Fgo=r \
  /source/ /destination/

Здесь D обозначает каталоги, а F — обычные файлы.

Символические ссылки

Сохранить ссылки как ссылки:

rsync -a /source/ /destination/

Копировать файлы и каталоги, на которые указывают ссылки:

rsync -aL /source/ /destination/

Копировать только ссылки, указывающие внутрь дерева источника:

rsync -a --safe-links /source/ /destination/

Сравнение файлов

По умолчанию rsync определяет изменения преимущественно по размеру и времени модификации.

Принудительное сравнение по контрольным суммам:

rsync -avc /source/ /destination/

Параметр -c повышает точность проверки, но увеличивает нагрузку на процессор и диски, поскольку содержимое файлов необходимо прочитать полностью.

Проверить различия без копирования:

rsync -avnc --itemize-changes /source/ /destination/

Формат --itemize-changes

Команда:

rsync -ani --delete /source/ /destination/

может выводить строки вида:

>f.st...... document.txt
.d..t...... reports/
*deleting   old-file.txt

Первый символ обычно показывает направление или характер изменения:

Символ Значение
> Файл передаётся в назначение
< Файл передаётся обратно
c Локальное изменение или создание
h Изменение жёсткой ссылки
. Содержимое файла не передаётся
* Специальное сообщение, например удаление

Следующие символы описывают изменение размера, времени, прав, владельца, группы и других атрибутов.

Перемещение файлов

Передать файлы и удалить успешно переданные исходники:

rsync -av --remove-source-files /source/ /destination/

Пустые исходные каталоги автоматически не удаляются. Их можно удалить отдельной командой после успешного завершения:

find /source -type d -empty -delete

Перед использованием проверьте пути и сначала выполните пробный запуск.

Работа с путями, содержащими пробелы

Локальные пути заключаются в кавычки:

rsync -av "/home/user/My Documents/" "/backup/My Documents/"

Для удалённых путей безопаснее передавать путь через аргумент, сохраняя корректное экранирование:

rsync -av "/local/data/" "user@host:/remote/My Documents/"

Поведение путей с пробелами может различаться в зависимости от оболочки и версии rsync. При сложных именах полезно применять --protect-args:

rsync -av --protect-args "/local/data/" "user@host:/remote/My Documents/"

Запуск через sudo на удалённом сервере

Если удалённой стороне требуются повышенные права:

rsync -av \
  --rsync-path="sudo rsync" \
  /local/data/ user@host:/protected/path/

На сервере для пользователя должен быть корректно настроен sudo. Интерактивный запрос пароля может помешать автоматическому выполнению.

Использование rsync-демона

Подключение к модулю демона:

rsync -av /local/data/ host::module/path/

Альтернативная запись:

rsync -av /local/data/ rsync://host/module/path/

Просмотр доступных модулей:

rsync host::

Режим демона отличается от передачи через SSH и требует отдельной настройки rsyncd.

Полезные готовые команды

Надёжное копирование каталога через SSH

rsync -aPz --info=progress2 \
  /local/data/ user@host:/remote/data/

Безопасная предварительная проверка зеркалирования

rsync -avhn --delete --itemize-changes \
  /source/ /destination/

Зеркалирование после проверки

rsync -avh --delete \
  /source/ /destination/

Резервная копия с исключениями

rsync -aP \
  --exclude='.cache/' \
  --exclude='*.tmp' \
  --exclude='node_modules/' \
  /home/user/ /backup/user/

Копирование с сохранением ACL и расширенных атрибутов

sudo rsync -aAXH --numeric-ids \
  /source/ /destination/

Синхронизация сайта с сервером

rsync -avz --delete \
  --exclude='.git/' \
  --exclude='.env' \
  --exclude='node_modules/' \
  ./ user@example.com:/var/www/site/

Коды завершения

Проверить код завершения последней команды:

echo $?

Распространённые коды:

Код Значение
0 Успешное завершение
1 Синтаксическая ошибка или некорректные параметры
2 Несовместимость протокола
3 Ошибка выбора файлов или каталогов
5 Ошибка запуска клиент-серверного протокола
10 Ошибка ввода-вывода сокета
11 Ошибка файлового ввода-вывода
12 Ошибка потока данных протокола
20 Получен сигнал завершения
23 Частичная передача из-за ошибки
24 Частичная передача: исходные файлы исчезли
30 Превышено время ожидания передачи
35 Превышено время ожидания подключения демона

Рекомендации по безопасности

Перед командами с --delete, --remove-source-files, --inplace или --delete-excluded всегда выполняйте пробный запуск:

rsync -avhn --delete /source/ /destination/

Проверяйте:

Получение встроенной справки

Краткая справка:

rsync --help

Полное руководство:

man rsync

Версия программы:

rsync --version