
Допустим, у меня есть следующая структура на путиorigin_path
origin_path/X=1/A/...
origin_path/X=1/B/...
origin_path/X=1/C/...
...
origin_path/X=2/A/...
origin_path/X=2/B/...
origin_path/X=2/C/...
...
...
Я хотел бы повторить структуру выше по другому пути, называемому destination_path
, нотольковключая пути, соответствующие каталогамБвыше.
Другими словами, я хотел бы получить следующее:destination_path
destination_path/X=1/B/...
destination_path/X=2/B/...
destination_path/X=3/B/...
...
Для ясности: часть этой структуры в пути назначения может уже существовать (например, папки destination_path/X=*
).
Насколько я понимаю, благодаря комментарию @Gilles, rsync
фильтры могут отлично подойти для этого. Однако я никогда не пользовался ими раньше, и мне немного сложно экстраполировать пример, представленный вФильтр Rsync: копирование только одного шаблонак моей ситуации.
В каком порядке мне следует включать или исключать вещи в моем случае? И как мне сказать rsync использовать origin_path
и destination_path
как глобальные пути? (в отличие от копирования вещей с относительными путями)
решение1
Следующее должно сделать то, что вам нужно:
rsync --recursive --prune-empty-dirs --include '*/' --include '*/B/**' --exclude '**' origin_path/ destination_path/
Первое правило включает все каталоги (иначе rsync не спустится в каталоги верхнего уровня). Второе правило включает все в подкаталогах "B". Третье правило исключает все остальное. Параметр --prune-empty-dirs
игнорирует пустые каталоги (так как мы включаем все каталоги с первым правилом).