Назад | Перейти на главную страницу

Как в rsync исключить все каталоги, соответствующие шаблону?

В 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/

Надеюсь это поможет.