В rsync я пытаюсь исключить подкаталоги, соответствующие шаблону. Но я не могу заставить его работать. Я следил за несколькими примерами, найденными здесь и в Google. Но я не получаю правильных результатов. Вот бит опции моей команды:
-avh --exclude 'branch*' --stats --delete --link-dest=$LNK
Моя структура исходного каталога
/root
/branch1
/branch2
/branch3
/other
/stillAnother
/etc
Это часть сценария резервного копирования. $ LNK - это ссылка на пункт назначения rsync предыдущего дня.
Мне не нужны / root / branch1, / root / branch2, / root / branch3. или их содержимое для синхронизации. Но они.
Вот биты исключения, которые я уже пробовал:
--exclude=branch*
--exclude='branch*'
--exclude '/branch*'
--exclude /branch*
Спасибо за любую помощь / совет.
РЕДАКТИРОВАТЬ - для устранения флажка "возможный дубликат"
Этот вопрос относится к известному списку каталогов. Мне нужно исключить любые каталоги, которые следуют шаблону, даже если эти каталоги еще не существуют. т.е. из моего примера другие каталоги с именем /branch*
могут быть добавлены. Мне нужно сделать свой сценарий перспективным и избегать редактирования сценария при добавлении каталога, соответствующего шаблону, поскольку эти каталоги могут быть временными.
Вы исключаете правило правильно. Однако rsync не будет удалять исключенные файлы в месте назначения без дополнительного параметра --delete-excluded
:
--delete-excluded also delete excluded files from dest dirs
Пример:
# tree test
test
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other
# tree test2
test2
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other
# rsync -avh test/ test2 --delete --exclude='branch1' --delete-excluded
sending incremental file list
deleting branch1/
sent 140 bytes received 27 bytes 334.00 bytes/sec
total size is 0 speedup is 0.00
# tree test2
test2
|-- 123
|-- branch2
|-- branch3
`-- other
3 directories, 1 file
rsync версии 3.1.3 (возможно, ранее, не проверял) правильно исключает подкаталоги с использованием этого синтаксиса (очевидно, заменяя exclude_dirname
с шаблоном, который вы хотите исключить):
rsync [other opts...] --exclude='*/exclude_dirname/' /src/ /dst/
Это также работает с подстановочными знаками. Исходный вопрос использует 'branch*'
, так что это работает:
rsync [other opts...] --exclude='*/branch*/' /src/ /dst/
Надеюсь это поможет.