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

29

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

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

Как попросить 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?

Амелио Васкес-Рейна
источник

Ответы:

33

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

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

Например.

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

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

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

Ричард Холлоуэй
источник
Спасибо @Richard. Ваш ответ заставляет меня думать, что мой первоначальный вопрос, возможно, был проще, чем я думал. Если я использую одну строку:, rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/pathне приведет ли это к rsyncудалению всего на пути получения, который не существует на пути отправки, кроме тех, которые совпадают с dont_delete_me? Самое главное, будут ли rsyncсовпадать вещи на принимающей стороне, dont_delete_me даже если на отправляющей стороне ничего не будет совпадатьdont_delete_me ? Если это так, я думаю, что это единственная линия, которая мне нужна, верно?
Амелио Васкес-Рейна
Вы правы, но вы также не получите новые файлы и изменения в папке dont_delete_me, если вы сделаете это в одной строке. Если вы не хотите синхронизировать изменения и дополнения, вы можете просто использовать флаг --exclude, как описано здесь.
Ричард Холлоуэй
@AmV Исключенные файлы не удаляются --delete, если вы явно не укажете --delete-excluded. Смотрите описание --deleteи --delete-excludedв руководстве по rsync.
Жиль "ТАК - перестань быть злым"
4

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

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

(Примечание: добавьте -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".

user2533809
источник