Из-за временных ограничений на территории РФ наблюдаются проблемы с оплатой. Если платёж не проходит, оставьте запрос в службу поддержки.Служба поддержки работает 24/7 — мы всегда на связи по вопросам хостинга и серверов.Открыт прием заявок на аренду выделенных серверов и размещение оборудования в дата-центре.Напоминаем: рекомендуем включить резервное копирование для дополнительной защиты данных.Доступна новая линейка VPS/VDS с NVMe-дисками и увеличенной производительностью.Технические работы на части серверов завершены. Все сервисы работают в штатном режиме.
Статья6 мин чтенияПросмотры0

rsync --dry-run: как увидеть удаление и перезапись до синхронизации

Практический guide по безопасной проверке rsync: читаем itemized-output, замечаем удаляемые файлы и выявляем изменение содержимого при одинаковых размере и времени.

Комментарии 0

Два накопителя соединены кабелем рядом с двумя лотками файлов перед проверкой синхронизации
В этой статье

Перед синхронизацией с удалением сначала выполните тот же rsync с --dry-run и --itemize-changes. Проверьте направление, завершающий слеш у источника и каждую строку *deleting. Только после этого решайте, допустим ли реальный запуск. Сухой прогон не заменяет резервную копию и проверку приложения.

Сначала проверим на маленькой модели. В источнике и назначении есть одинаковый файл, файл с другой длиной, новый и лишний файлы. Ещё один файл имеет разное содержимое, но одинаковые размер и время изменения — именно он показывает границу обычной быстрой проверки rsync.

Входные условия и границы

  • Linux с rsync 3.2.7, protocol 31; локальная модель проверена 17 октября 2026 года.

  • Источник и назначение — отдельные временные каталоги. Рабочие файлы, службы и сеть не использовались.

  • Ключ --delete включён намеренно: материал показывает, как увидеть удаление до реального запуска.

  • Удалённый SSH-сервер, ACL, extended attributes, sparse-файлы и открытые базы данных в стенде не проверялись.

rsync --version

В проверенной среде команда показала rsync 3.2.7 и protocol version 31. На удалённой синхронизации версию нужно проверить с обеих сторон: набор опций и формат диагностики зависят от фактически запущенных бинарных файлов.

Почему завершающий слеш меняет результат

Источник source/ означает «содержимое каталога source», а source без завершающего слеша — сам каталог source. При неверном варианте файлы могут оказаться на дополнительном уровне вложенности. Dry-run покажет имена, но заметить ошибку можно только если заранее записано ожидаемое дерево назначения.

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

Здесь -a включает архивный режим, -n запрещает изменения, -i выводит краткое описание каждого действия, а --delete добавляет в план удаление объектов назначения, которых нет в источнике. Команда остаётся опасной после удаления -n, поэтому направление и фильтры проверяют до запуска.

Семантика опций и завершающего слеша сверена с официальным руководством rsync. Документация отдельно предупреждает сначала использовать dry-run перед --delete.

Источник и назначение перед rsync: одинаковый файл, изменения размера и содержимого, новый и лишний файлы
Учебный набор. changed-hidden.txt отличается содержимым, но имеет те же 5 байт и одинаковое время изменения.

Что показал обычный dry-run

rsync -ani --delete "$src/" "$dst/"

*deleting stale.txt >f.s....... changed-size.txt >f+++++++++ new.txt

Назначение осталось неизменным: список имён и SHA-256 каждого файла до и после dry-run совпал. Но changed-hidden.txt в выводе отсутствует. По умолчанию rsync использует быструю проверку размера и времени изменения; одинаковые значения могут скрыть отличающееся содержимое.

Строка

Что наблюдаем

Что проверить

*deleting stale.txt

Файл есть только в назначении и попал в план удаления

Нужен ли он, не защищён ли фильтром и верно ли выбрано направление

>f+++++++++ new.txt

В назначении будет создан новый обычный файл

Ожидаемы ли путь и уровень вложенности

>f.s....... changed-size.txt

Файл будет передан; размер отличается

Не является ли изменение неполной записью или случайным источником

Нет строки для changed-hidden.txt

Быстрая проверка сочла файл неизменным

Нужна ли проверка содержимого через --checksum

Когда нужен --checksum

Если размер и mtime нельзя считать надёжным признаком — например, файлы восстановлены с сохранением времени или сформированы одинаковой длины — добавьте --checksum. Тогда rsync читает содержимое файлов с обеих сторон для предварительного сравнения. Это повышает дисковую нагрузку и время проверки, особенно на большом дереве.

rsync -anic --delete "$src/" "$dst/"

*deleting stale.txt >fc........ changed-hidden.txt >fcs....... changed-size.txt >f+++++++++ new.txt

В строке >fc........ буква c означает изменение контрольной суммы содержимого. changed-hidden.txt обнаружен, хотя длина и mtime совпадали. Это не доказывает согласованность базы данных и файлов приложения: rsync сравнивает доступные объекты, а не бизнес-транзакции.

Воспроизводимый тест

Сценарий создал два временных каталога. Для changed-hidden.txt в источнике записано BBBB, в назначении — AAAA; оба файла имеют 5 байт и одинаковый mtime. До реального запуска хэши назначения сохранены и повторно рассчитаны после обычного dry-run.

printf 'BBBB\n' >"$src/changed-hidden.txt" printf 'AAAA\n' >"$dst/changed-hidden.txt" touch -t 202601010101 "$src/changed-hidden.txt" "$dst/changed-hidden.txt"

Обычный dry-run завершился с кодом 0 и не изменил ни один файл, но не показал скрытое расхождение. Dry-run с --checksum показал четыре действия. Затем в той же изолированной модели выполнен реальный rsync с теми же опциями без -n.

rsync -aic --delete "$src/" "$dst/"

Itemized-output реального запуска дословно совпал с checksum dry-run. changed-size.txt и changed-hidden.txt обновились, new.txt появился, stale.txt исчез. Повторный dry-run с --checksum вернул пустой вывод и код 0.

rsync -anic --delete "$src/" "$dst/" printf 'exit=%s\n' "$?"

exit=0

Этап

Код

Наблюдение

Изменение назначения

Обычный dry-run

0

Три действия; скрытое изменение не найдено

Нет

Dry-run с --checksum

0

Четыре действия, включая changed-hidden.txt

Нет

Реальный запуск

0

Вывод совпал с checksum dry-run

Да, только в учебном каталоге

Финальный checksum dry-run

0

Пустой вывод

Нет

Четыре этапа проверки rsync: обычный dry-run, dry-run с checksum, фактический прогон и финальная проверка без изменений
Наблюдаемый протокол rsync 3.2.7: checksum добавил скрытое изменение, реальный вывод совпал с предварительным, финальный dry-run пуст.

Порядок перед рабочей синхронизацией

  1. Зафиксируйте источник, назначение, направление передачи, пользователя и версии rsync на обеих сторонах.

  2. Проверьте завершающий слеш и ожидаемый уровень вложенности на небольшом известном поддереве.

  3. Выполните dry-run с теми же include, exclude и delete-опциями, которые планируются в реальном запуске.

  4. Отдельно разберите каждую строку *deleting; при сомнении остановитесь и сохраните нужные данные независимым способом.

  5. Решите, достаточны ли размер и mtime. Если нет, оцените нагрузку и выполните dry-run с --checksum.

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

  7. Выполните реальный запуск без -n в согласованное окно и сохраните код завершения и itemized-output.

  8. Повторите dry-run и проверьте не только пустой план rsync, но и работоспособность приложения и целостность данных.

Если задача относится к резервной копии интернет-магазина, отдельно проверьте RPO, RTO и тестовое восстановление: пустой вывод rsync не доказывает, что копия пригодна для восстановления.

Где dry-run не даёт гарантии

  • Источник или назначение изменились между предварительным и реальным запуском.

  • Реальный запуск столкнулся с ошибкой чтения, записи, места, сети или прав, которой не было во время проверки.

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

  • Фильтры защищают или исключают объект иначе, чем ожидалось; особенно внимательно проверяют правила вместе с --delete.

  • Нужны ACL, extended attributes, hard links, sparse-файлы или владельцы, но соответствующие опции не включены и не проверены.

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

Обсуждение 0

Делись опытом и задавай вопросы. Комментарии без ссылок появляются после проверки редактором.

Пока никто не написал. Начни обсуждение.