30 Oct 2026
Пост разбирает базовое использование rsync на примере задачи: отправить локальный каталог с сайтом на сервер и положить его в каталог веб-сервера.
Все примеры проверены на rsync 3.2.7.
Что такое rsync
rsync — утилита для копирования и синхронизации файлов. От cp и scp её отличают три вещи:
- Копирует только изменившееся. Файл считается изменённым, если у него отличаются размер или время модификации. Остальные файлы пропускаются, поэтому повторный запуск занимает секунды.
- Передаёт только изменённые части файла. Это работает при копировании на удалённую машину. При копировании между локальными каталогами файлы передаются целиком.
- Умеет приводить назначение к виду источника. Для этого служит параметр
--delete(см. ниже).
Утилита должна быть установлена на обеих машинах: на локальной и на сервере.
rsync --version # проверка
sudo dnf install rsync # RHEL / AlmaLinux
sudo apt install rsync # Debian / Ubuntu
Если на сервере rsync нет, команда завершится ошибкой rsync: command not found (код выхода 127).
Синтаксис
rsync [параметры] источник назначение
Всегда сначала источник (что копируем), потом назначение (куда копируем).
Удалённый путь записывается как user@host:путь. Если путь относительный, он считается от домашнего каталога пользователя на сервере.
Сначала пробный прогон: -n и -v
rsync может удалить или перезаписать больше, чем вы рассчитывали. Поэтому любая команда сначала запускается с -n:
-n(--dry-run) — ничего не менять, только показать, что будет сделано;-v(--verbose) — выводить список обрабатываемых файлов.
rsync -nva --delete src/dir/ dst/
sending incremental file list
deleting old.txt
a.txt
new.txt
sent 115 bytes received 111 bytes 452.00 bytes/sec
total size is 14 speedup is 0.06 (DRY RUN)
Признак пробного режима — пометка (DRY RUN) в последней строке. Строки deleting … — это то, что будет удалено в назначении.
Подробный вывод: -i
Параметр -i (--itemize-changes) показывает, что именно изменится в каждом файле:
rsync -nai --delete src/dir/ dst/
*deleting old.txt
>f.st...... a.txt
>f+++++++++ new.txt
Строка читается так: первый символ — направление (> — файл передаётся на приёмник), второй — тип (f файл, d каталог, L ссылка). Далее идут признаки отличий: s — размер, t — время. Знаки +++++++++ — объекта нет в назначении, он будет создан. *deleting — объект будет удалён.
Завершающий слеш в пути источника
Слеш в конце пути источника определяет, что именно копируется. Это самая частая причина ошибок.
Исходная структура:
src/
└── dir/
├── a.txt
└── b.txt
Без слеша копируется сам каталог:
rsync -a src/dir dst/
dst/
└── dir/
├── a.txt
└── b.txt
Со слешем копируется только содержимое каталога:
rsync -a src/dir/ dst/
dst/
├── a.txt
└── b.txt
Слеш в конце пути назначения ни на что не влияет.
Чтобы избежать неоднозначности, указывайте источник со слешем и всегда проверяйте результат через
-n.
Путь назначения на удалённой машине
rsync -a src/dir/ user@host:dest_dir
Путь dest_dir — относительный, он считается от домашнего каталога: /home/user/dest_dir. Абсолютный путь начинается со слеша: user@host:/var/www/html/.
Если в пути назначения ничего нет после двоеточия, это домашний каталог:
rsync -a file.txt user@host:
rsync создаёт только последний уровень каталога назначения. Если не хватает промежуточных, команда завершится ошибкой mkdir ... failed: No such file or directory, код 11. Начиная с версии 3.2.3 можно добавить --mkpath, и тогда создаётся вся цепочка:
rsync -a --mkpath src/dir/ dst/x/y/z/
Параметры
-a — режим архива
Сокращение для -rlptgoD:
| Флаг | Что делает |
|---|---|
-r |
рекурсивно обходит каталоги |
-l |
копирует символические ссылки как ссылки |
-p |
сохраняет права доступа |
-t |
сохраняет время модификации |
-g |
сохраняет группу |
-o |
сохраняет владельца |
-D |
сохраняет устройства и специальные файлы |
Флаг -t важен для скорости: благодаря ему при следующем запуске rsync видит совпадающее время и пропускает файл.
Владелец и группа сохраняются только если приёмник работает от root. Для обычного пользователя флаги -o и -g не дают эффекта, ошибки при этом нет.
-e — команда для подключения, нестандартный порт SSH
По умолчанию rsync подключается по SSH на порт 22. Если сервер слушает другой порт, передайте его через -e:
rsync -a -e "ssh -p 2222" html/ user@host:html/
Порт SSH указывается строчной -p. Не путайте со scp, где порт задаётся заглавной -P.
Альтернатива — описать сервер в ~/.ssh/config и не указывать порт в каждой команде:
Host myserver
HostName host.example.com
User user
Port 2222
rsync -a html/ myserver:html/
--exclude — исключить файлы и каталоги
rsync -a -e "ssh -p 2222" --exclude 'assets/css' html/ user@host:html/
Правила сопоставления шаблона:
- шаблон сравнивается с путём относительно корня передачи (то есть относительно источника со слешем);
- шаблон
assets/cssсовпадает сassets/cssна любой глубине: и сhtml/assets/css, и сhtml/other/assets/css; - шаблон со слешем в начале привязан к корню:
--exclude '/assets/css'исключит толькоhtml/assets/css; - параметр можно повторять, а длинный список вынести в файл:
--exclude-from=exclude.txt.
Исключённые файлы не удаляются в назначении при использовании --delete.
--delete — привести назначение к виду источника
--delete удаляет в назначении всё, чего нет в источнике:
rsync -a --delete -e "ssh -p 2222" test/ user@host:test/
Это самый опасный параметр rsync. Типичная катастрофа — неверный путь назначения:
# хотели обновить /var/www/html, а указали /var/www/
rsync -a --delete html/ user@host:/var/www/
Из /var/www/ будет удалено всё, чего нет в html/, включая другие сайты. Поэтому правила такие:
- Сначала команда с
-nv(или-nai), и внимательное чтение спискаdeleting. - Только потом та же команда без
-n. - В скриптах ограничивайте ущерб:
--max-delete=Nпрервёт работу, если удалений больше N.
Родственные параметры:
--delete-after— удалять после передачи, а не до (при сбое передачи старые файлы останутся);--backup --backup-dir=DIR— удаляемое и перезаписываемое переносить вDIR, а не уничтожать.
Другие полезные параметры
| Параметр | Назначение |
|---|---|
-z |
сжимать данные при передаче (для уже сжатых файлов — jpg, zip — бесполезно) |
-h |
размеры в человекочитаемом виде |
-P |
сокращение для --partial --progress: прогресс и докачка прерванных файлов |
-u |
не трогать файлы, которые новее на приёмнике |
--ignore-existing |
не обновлять файлы, которые уже есть в назначении |
-c |
сравнивать по контрольной сумме, а не по размеру и времени (медленно) |
--bwlimit=КБ/с |
ограничить скорость |
--stats |
вывести итоговую статистику |
Практика: деплой каталога сайта
Задача: каталог html/ на локальной машине должен оказаться в /var/www/html/ на сервере.
Обычный пользователь не имеет права записи в /var/www/html/, поэтому деплой делается в два шага через домашний каталог.
Шаг 1. Локальная машина → домашний каталог сервера.
rsync -nva --delete -e "ssh -p 2222" html/ user@host:html/ # проверка
rsync -a --delete -e "ssh -p 2222" html/ user@host:html/ # выполнение
Шаг 2. На сервере: домашний каталог → каталог веб-сервера.
sudo rsync -nva --delete ~/html/ /var/www/html/ # проверка
sudo rsync -a --delete ~/html/ /var/www/html/ # выполнение
После sudo rsync -a файлы в /var/www/html/ получат владельца user. Веб-серверу этого достаточно, если права позволяют чтение. Если нужен другой владелец, добавьте --chown (rsync 3.1.0+, работает при запуске от root):
sudo rsync -a --delete --chown=apache:apache ~/html/ /var/www/html/
Имя пользователя веб-сервера зависит от системы: apache или nginx на RHEL-семействе, www-data на Debian и Ubuntu.
Деплой одной командой
Можно запустить rsync на сервере от root прямо через SSH:
rsync -a --delete -e "ssh -p 2222" --rsync-path="sudo rsync" html/ user@host:/var/www/html/
Для этого sudo на сервере не должен запрашивать пароль для rsync. Настройка NOPASSWD для rsync даёт пользователю возможность писать в любое место файловой системы, поэтому такой вариант подходит только когда вы осознаёте риск. Двухшаговый вариант безопаснее и нагляднее.
Типичные ошибки
| Симптом | Причина |
|---|---|
| В назначении появился лишний вложенный каталог | у источника нет завершающего слеша |
| Удалилось лишнее | --delete без пробного прогона или неверный путь назначения |
rsync: command not found (код 127) |
на одной из машин нет rsync |
Connection refused |
указан не тот порт SSH, не добавлен -e "ssh -p …" |
Permission denied (13) |
нет прав записи в каталоге назначения |
mkdir ... failed: No such file or directory (код 11) |
не хватает промежуточных каталогов, нужен --mkpath |
| Источник и назначение перепутаны | порядок аргументов: сначала источник |
Справка
man rsync
rsync --help
Мануал онлайн: https://download.samba.org/pub/rsync/rsync.1
Документация проекта: https://rsync.samba.org/documentation.html