Удалить посторонние файлы из Dest Dir через Rsync?

51

Скажи у меня есть

SRC 
  001.jpg
  002.jpg
  001.txt
  a.zip

DEST
  hello.jpg

rsync -d --delete SRC:{*.jpg,*.txt} DEST

Это не удаляет hello.jpg из DEST, есть идеи, как заархивировать это?

Cheng
источник

Ответы:

72

Причина, по которой ваша команда не работает, объясняется страницей справочника по rsync (выделение добавлено):

--удалять

Это говорит rsync об удалении посторонних файлов с принимающей стороны (тех, которые не на отправляющей стороне), но только для каталогов, которые синхронизируются. Вы, должно быть, попросили rsync отправить весь каталог (например, "dir" или "dir /") без использования подстановочного знака для содержимого каталога (например, "dir / *"), поскольку подстановочный знак раскрывается оболочкой, и, таким образом, rsync получает запрос на передачу отдельных файлов, а не родительский каталог файлов. Файлы, которые исключены из передачи, также исключаются из удаления, если вы не используете опцию --delete-exclude или не помечаете правила как совпадающие только на отправляющей стороне (см. Модификаторы include / exclude в разделе ПРАВИЛА ФИЛЬТРА).

Таким образом, когда вы бежите

$ rsync -d --delete SRC:{*.jpg,*.txt} DEST

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

rsync -d --delete-excluded --include '*.jpg' --include '*.txt' --exclude '*' SRC/ DEST/

Обратите внимание, что порядок директив include и exclude имеет значение. По сути, каждый файл проверяется на соответствие шаблонам включения или исключения в порядке их появления. Таким образом, файлы с расширениями .jpg или .txt синхронизируются, поскольку они соответствуют шаблонам «включенных» до того, как они соответствуют исключенному шаблону «*». Все остальное исключается по --exclude '*'шаблону. В --delete-excludedпараметре гарантирует , что даже исключенные файлы на DEST стороны будут удалены.

Стивен Д
источник
@ Чен, не хочешь объяснить немного больше? Я был бы рад обновить мой ответ, если есть проблема / улучшение.
Стивен Д.
Оно работает. Я полагаю. - Процессные вещи сбивают меня с толку, заставляют меня думать, что это было передано снова.
Ченг
Я отредактировал свой ответ, чтобы объяснить немного больше.
Стивен Д
2
@ Ченг: Я подозреваю, что вы не хотите --delete-excluded. Без этого только *.jpgи *.txtмогут быть удалены на стороне назначения. При этом несвязанные файлы будут также удалены. Вас может заинтересовать это руководство по фильтрам rsync .
Жиль "ТАК ... перестать быть злым"
3
Спасибо! Для меня я пропустил косую черту в исходном каталоге.
Вон