Я прочитал эти темы:
- rsync --delete --files-from = list / dest / не удаляет ненужные файлы
- Удалить посторонние файлы из Dest Dir через Rsync?
Но, насколько я могу судить (возможно, я что-то упустил), они не охватывают следующий вопрос:
Как попросить rsync
скопировать файлы и удалить те, что находятся на принимающей стороне, которых нет на отправляющей стороне, за исключением? (например, не удаляйте ртутный репозиторий .hg
на принимающей стороне, даже если на передающей стороне нет репозитория).
Одна возможность?
Заимствование из ответа @Richard Holloway ниже. Скажем, у меня есть следующая строка:
rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path
Насколько я понимаю, эта строка заставит rsync
удалить все на пути получения, который не существует на пути отправки, кроме тех, которые соответствуют dont_delete_me
. Мой вопрос теперь таков: будет ли rsync сохранять файлы на принимающей стороне, с которыми сопоставляются, dont_delete_me
даже если на отправляющей стороне ничего не совпадает dont_delete_me
?
rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path
не приведет ли это кrsync
удалению всего на пути получения, который не существует на пути отправки, кроме тех, которые совпадают сdont_delete_me
? Самое главное, будут лиrsync
совпадать вещи на принимающей стороне,dont_delete_me
даже если на отправляющей стороне ничего не будет совпадатьdont_delete_me
? Если это так, я думаю, что это единственная линия, которая мне нужна, верно?--delete
, если вы явно не укажете--delete-excluded
. Смотрите описание--delete
и--delete-excluded
в руководстве по rsync.Я обнаружил, что следующее решение работает для моих целей:
(Примечание: добавьте
-n
опцию, чтобы выполнить пробный прогон, и не переходите--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
".источник