venv/precisa ser excluído antes da */ inclusão:
rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
A sutileza é que rsyncprocessa as regras em ordem e a primeira regra correspondente vence. Portanto, se --include='*/'for anterior --exclude='venv/', o diretório venv/será incluído --include='*/'e a regra de exclusão nunca será consultada.
Poderíamos simplificar isso?
Por que precisamos --include='*/'e --exclude='*'? Por que não é --exclude=venv/ --include='*.py'suficiente?
O padrão é incluir arquivos / diretórios. Então, considere:
rsync -avz --exclude='venv/' --include='*.py' source target
Isso incluiria tudo, exceto arquivos ou diretórios abaixo venv/. Você, no entanto, deseja apenas .pyarquivos. Isso significa que temos que excluir explicitamente outros arquivos com --exclude='*'.
--exclude='*'exclui ambos os arquivos e diretórios. Portanto, se especificarmos --exclude='*', todos os diretórios serão excluídos e apenas os .pyarquivos no diretório raiz serão encontrados. .pyos arquivos nos subdiretórios nunca seriam encontrados porque rsyncnão examinam diretórios que são excluídos. Assim, se tivermos --exclude='*', precisamos precedê-lo --include='*/'para garantir que o conteúdo de todos os diretórios seja explorado.
--include='*/'?