venv/ precisa ser excluído antes */ ser incluído:
rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
A sutileza é que rsync processa regras em ordem e a primeira regra correspondente ganha. Portanto, se --include='*/' for anterior a --exclude='venv/' , o diretório venv/ será incluído por --include='*/' e a regra de exclusão nunca será consultada.
Podemos simplificar isso?
Why do we need
--include='*/'and--exclude='*'? Why isn't--exclude=venv/ --include='*.py'sufficient?
O padrão é incluir arquivos / diretórios. Então, considere:
rsync -avz --exclude='venv/' --include='*.py' source target
Isso inclui tudo, exceto arquivos ou diretórios em venv/ . Você, no entanto, só deseja arquivos .py . Isso significa que temos que excluir explicitamente outros arquivos com --exclude='*' .
--exclude='*' exclui ambos arquivos e diretórios. Portanto, se especificarmos --exclude='*' , todos os diretórios seriam excluídos e apenas os arquivos .py do diretório raiz seriam encontrados. .py arquivos em subdiretórios nunca seriam encontrados porque rsync não procura em diretórios excluídos. Portanto, se tivermos --exclude='*' , precisamos precedê-lo com --include='*/' para garantir que o conteúdo de todos os diretórios seja explorado.