mrsaynothing.dev
rsync command generator — сначала dry-run, удаление с сеткой

> rsync command generator — сначала dry-run, удаление с сеткой▋

Большинство генераторов rsync просто собирают флаги и желают удачи. Этот по умолчанию делает dry-run и отказывается выдавать «голый» --delete: страховочная сетка делает каждое зеркало обратимым.

mrsaynothing· 16 октября 2026 г.· 5 мин чтения

Чем отличается синхронизация от зачистки? Обычно одним флагом. Наберите rsync -a --delete /mnt/empty-usb/ /home/you/ — и rsync старательно приведёт приёмник в соответствие с источником, причём целиком, включая ту часть, где ваш домашний каталог теперь пуст. Каждый генератор, который мне удалось найти на первой странице, радостно прячет этот флаг за чекбоксом; один даже подписывает свой вывод «сгенерировано ИИ и ещё не проверено» — смело печатать такое над командой удаления. Именно эту ложь инструмент и не приемлет: что собрать синтаксис rsync и понять семантику rsync — одна и та же работа. rsync command generator уже запущен — он собирает команду, называет ловушки человеческим языком и обращается с --delete как с заряженным оружием, каким тот и является.

Почему --delete заслуживает предупреждения?

Потому что договор rsync — сделать приёмник идентичным источнику, а --delete распространяет этот договор на удаления. Man-страница говорит прямо: флаг означает «delete extraneous files from the destination dir». Extraneous — это всё, чего нет в источнике, включая то, чего не хватает лишь потому, что вы указали не на тот источник, смонтировали не ту флешку или опечатались в пути. Задача генератора — сделать это последствие видимым до запуска команды, а не после:

Флаг Что делает Что делает, когда вы ошиблись
--delete Файлы приёмника, которых нет в источнике, удаляются Не тот путь источника → файлы приёмника «extraneous» → исчезли
src/ vs src Завершающий слеш копирует содержимое; без слеша копируется сам каталог Один символ — совершенно иная структура приёмника
-a Архив: рекурсивно + права, времена, владельцы, симлинки Пропущен → «бэкап», который молча им не является
--partial Хранит недопереданные файлы при обрыве Ненадёжный канал → весь перенос заново с нуля

Строка про завершающий слеш — классика. Собственная документация rsync сообщает, что слеш у источника «changes this behavior to avoid creating an extra directory at the destination» — что на языке документации значит: src/ высыпает содержимое в приёмник, src создаёт dest/src и высыпает туда. Два символа. Генератор показывает, какая формулировка действует прямо во время ввода, потому что завершающий слеш — единственный флаг rsync, съевший за свою жизнь больше домашних каталогов, чем rm -rf.

Как взвести удаление безопасно

Вы не снимаете предохранитель — вы добавляете сетку. У генератора два шага взведения: команда выходит с --dry-run, и вы читаете, что произошло бы; только затем переключаете тумблер для настоящего запуска. И в момент, когда появляется --delete, инструмент отказывается выдавать голое удаление. Он пристраивает сетку:

rsync -a --delete \
  --backup --backup-dir=/mnt/backup/_rsync_backup_$(date +%F) \
  /mnt/usb/ /mnt/backup/

Со включёнными --backup --backup-dir rsync не уничтожает файлы, которые удаляет или перезаписывает, — сначала он отодвигает их в датированную папку. Зеркало в итоге всё равно точное. В тот день, когда выяснится, что источник был смонтирован не тот, ваши файлы лежат в _rsync_backup_2026-10-16/, а не превратились в урок. Обратимость — вот разница между зеркалом и памятью.

Да: rsync -a --delete --backup --backup-dir=DEST/_rsync_backup_$(date +%F) SRC/ DEST/. Два флага сетки переносят каждый удалённый или перезаписанный файл в датированную папку вместо стирания, поэтому зеркало остаётся точным, а удаления — обратимыми. Сначала dry-run с -n, прочтите список, затем взводите.

проверка: man rsync → у --backup написано «make a backup of every file installed» · строки --backup-dir падают в DEST/_rsync_backup_<date>/, а не в пустоту

Какие флаги подключает генератор

Набор, покрывающий почти любой реальный перенос, сгруппированный так, как вы о нём реально принимаете решения:

  • Пути — локальные или удалённые с любой стороны (user@host:/path), с портом SSH через -e "ssh -p 2222", если это не 22.
  • Направление — переключатель завершающего слеша, с живой подсказкой «содержимое или каталог».
  • Фильтры — шаблоны --exclude с пресетами для вечных подозреваемых: .git, node_modules, кэши, логи.
  • Манеры — сжатие -z, --bwlimit, чтобы ночной бэкап перестал забивать канал всей семье, -P для прогресса и возобновления, -c, когда mtime врёт.
  • Дорожка взведения — dry-run по умолчанию, явный шаг взведения, сетка автоматически прицепляется к любому --delete.

Результат — одна команда, готовая к вставке (или многострочник с backslash — как вашему терминалу удобнее), плюс встраиваемый сниппет, если хотите генератор у себя на странице. Как и калькулятор VRAM для GGUF, это один HTML-файл, который считает в вашем браузере, — ничто из введённого страницу не покидает, потому что инструмент про безопасное копирование не должен звонить домой.

Какое место в наборе инструментов

Генератор собирает команду; теория живёт в соседних статьях. Rsync против scp — о том, почему дельта-передача rsync бьёт тупое копирование и когда scp всё ещё уместен. Cron против таймеров systemd — половина про расписание: команда rsync из генератора ложится в таймер, а журнальная сторона вопроса «а выполнилось ли» — в шпаргалке по journalctl.

Пропущенный dry-run — это удаление, которого вы не хотели.

Инструмент лежит на github.com/mrsaynothing/rsync-builder — MIT, один файл, без сборки. Если поток взведения когда-нибудь покажется ворчливым — это работает фича; а если назовёте комбинацию флагов, которую сетка не покрывает, открывайте issue — опасные углы как раз и стоит наносить на карту.

$ Следующий лог сборки — на почту

Одно письмо на пост. С доказательствами и ошибками.

self-hosted · никаких третьих сторон · отписка в один клик

Одно письмо, еженедельная сводка. Ноль пикселей.

что это?