venv/
Необходимо исключить до того, как */
будет включено:
rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Тонкость в том, что rsync
правила обрабатываются по порядку, и первое соответствующее правило выигрывает. Таким образом, если --include='*/'
это раньше --exclude='venv/'
, то каталог venv/
включается --include='*/'
и правило исключения никогда не используется.
Можем ли мы упростить это?
А зачем нам --include='*/'
и --exclude='*'
? Почему не --exclude=venv/ --include='*.py'
достаточно?
По умолчанию включены файлы / каталоги. Итак, рассмотрим:
rsync -avz --exclude='venv/' --include='*.py' source target
Это будет включать все, кроме файлов или каталогов в venv/
. Вы, однако, хотите только .py
файлы. Это означает, что мы должны явно исключить другие файлы с --exclude='*'
.
--exclude='*'
исключает как файлы, так и каталоги. Таким образом, если мы укажем --exclude='*'
, то все каталоги будут исключены, и .py
будут найдены только файлы в корневом каталоге. .py
файлы в подкаталогах никогда не будут найдены, поскольку rsync
не ищет исключенные каталоги. Таким образом, если у нас есть --exclude='*'
, мы должны предшествовать этому, --include='*/'
чтобы гарантировать, что содержание всех каталогов исследовано.
--include='*/'
?