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

8

В 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 игнорирует ветвь * при копировании, он также игнорирует ее при удалении из dest, поэтому вы должны вручную удалить эти каталоги в месте назначения.
Ипор Сирсер
назначение - это новый пустой каталог, созданный моим bash-скриптом. Я удалил каталоги филиалов * из каталога link-dest, но безрезультатно.
Роджер Крэзи
1
Вы должны использовать явный полный шаблон, такой как короткая форма *branch*или /root/branch*нет, короткая branch*форма не найдена и, следовательно, не исключена.
Кондыбас
@ Kondybas Итак, у меня все в порядке, кроме того, что мне нужно добавить '*' к моей ветви исключения? ( --exclude '*branch*)
Роджер Крэзи

Ответы:

2

Вы исключаете, что правило является правильным. Однако 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
М. Глатки
источник
Я изменил свои параметры в сценарии, чтобы -avh --exclude 'branch*' --stats --delete --delete-excluded --link-dest=$LNKрезервное копирование прошлой ночью все еще копировало каталоги / branch *.
Роджер Криси
1

Версия rsync 3.1.3 (возможно, ранее, не проверенная) правильно исключает подкаталоги, использующие этот синтаксис (очевидно, заменяя exclude_dirnameшаблоном, который вы хотите исключить):

rsync [other opts...] --exclude='*/exclude_dirname/' /src/ /dst/

Это также работает с подстановочными знаками. Оригинальный вопрос использует 'branch*', так что это работает:

rsync [other opts...] --exclude='*/branch*/' /src/ /dst/

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

AaronDanielson
источник