it-swarm-ru.tech

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

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

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

Как попросить rsync скопировать файлы и удалить те, которые находятся на принимающей стороне, которые не существуют на отправляющей стороне, за исключением? (например, не удаляйте хранилище Mercurial .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?

29
Amelio Vazquez-Reina

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

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

Например.

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

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

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

33
Richard Holloway

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

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".

4
user2533809