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='*/'?