Просить rsync удалять файлы на принимающей стороне, которых нет на стороне отправки, с исключениями на принимающей стороне

Я прочитал эти темы:

  • rsync –delete –files-from = list / dest / не удаляет ненужные файлы
  • Удалить посторонние файлы из dest dir через rsync?

Но, насколько я могу судить (может быть, я чего-то не хватает), они не охватывают следующий вопрос:

Как вы просите rsync копировать файлы и удалять их на принимающей стороне, которые не существуют на стороне отправки, с исключениями? (например, не удалять ртутный репозиторий .hg на принимающей стороне, даже если на отправляющей стороне нет репозитория).

Одна возможность?

Заимствование из ответа @ Рихарда Холлоуэя ниже. Скажем, у меня есть следующая строка:

 rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path 

Насколько я понимаю, эта строка заставит rsync удалять все на пути приема, который не существует на пути отправки, кроме тех, которые соответствуют dont_delete_me . Теперь мой вопрос: будет ли rsync хранить файлы на принимающей стороне, которые сопоставляются dont_delete_me даже если ничто на отправляющей стороне не соответствует dont_delete_me ?

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

Но возникает проблема, что папка вообще не будет rsync 'd. Для sync этой папки вам понадобится другое задание rsync .

Например.

 rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/ rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh 

Вы можете запустить их по-другому, но затем он удалит все удаленные файлы, а затем заменит их, что не так эффективно.

Вы не можете сделать это как один лайнер.

Я обнаружил, что следующее решение работает для моих целей:

 rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest 

(Примечание: добавьте параметр -n для выполнения сухого --delete и не меняйте --delete на --delete-excluded !)

Запуск команды вызывает следующие свойства:

  • Исходный каталог src остается немодифицированным
  • dest папка назначения соответствует исходной папке, за исключением:

    • элементы в списке do_not_send_to_dest не отправляются в пункт назначения и
    • элементы в списке do_not_modify_in_dest остаются неизмененными в пункте назначения.
  • (Примечание. Это не проблема для несуществующих элементов, которые должны быть указаны в любом из файлов « do_not_ ».)

объяснение

Я думаю, как rsync читает аргументы командной строки слева направо, аргумент --delete видимому, вызывает rsync внутренне «режимы переключения» (в некотором смысле), что позволяет повторное использование опции --exclude-from но с другое значение.

Надеюсь это поможет.

Предостережение:

  • Если элемент в списке do_not_send_to_dest уже существует в пункте назначения, то:

    • эта команда не удаляет этот элемент из адресата (если элемент не был сначала удален из исходного каталога)
    • Внимание: изменение --delete на --delete-excluded удалит все в пункте назначения, указанном в любом из двух ваших списков. xD (Возможно, rsync был написан как открытый / гибкий, но имеет некоторые с нюансами?)

Легкое тестирование.

Я использую rsync version 3.0.9 protocol version 30 .