Возможность 1
Не используя правила фильтрации rsync, но расширение оболочки * вы можете сделать:
а. Чтобы включить все каталоги bin
в иерархию top_dir
:
rsync -av -R top_dir/**/bin/ destination_path
Здесь -R
- параметр rsync, обозначающий относительный и означающий, что структура каталогов сохраняется.
**
- это шаблон оболочки, который рекурсивно ищет каталоги с именем bin
в top_dir
. Итак, в приведенном выше примере командная строка расширяется до:
rsync -av -R top_dir/proj1/bin/ top_dir/proj2/bin/ destination_path
б. Если вы хотите включить каталог bin
один уровень ниже каталога проекта, просто используйте один *
(который также работает с "древними" оболочками!):
rsync -av -R top_dir/*/bin/ destination_path
* Вам нужна последняя версия bash (> 4) и активировать рекурсивное сглаживание с помощью shopts -s globstar
. С zsh рекурсивное сглаживание используется по умолчанию.
Возможность 2
Вам нужны только правила фильтрации rsync:
а. Чтобы включить все каталоги bin
в иерархию top_dir
:
rsync -av -m --include='**/' --include='**/bin/**' --exclude='*' top_dir/ destination_path
Первое правило включения может быть неочевидным +, но гарантирует, что во всех каталогах (обратите внимание на конечный символ /
) выполняется поиск, второе наконец добавляет все в каталоги bin
а правило исключения исключает все остальное. -m
удостоверяется, что пустые каталоги не копируются.
б. Только один уровень ниже директории проекта:
rsync -av -m --include='/*/' --include='/*/bin/***' --exclude='*' top_dir/ destination_path
Используя ***
синтаксис rsync> = 2.6.7. Начальные /
в шаблонах представляют top_dir
, в противном случае шаблоны сопоставляются с концом пути к файлу.
+ Искать в / rsync /some/path/this-file-will-not-be-found
в man rsync