venv/
precisa ser excluído antes da */
inclusão:
rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
A sutileza é que rsync
processa 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 .py
arquivos. 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 .py
arquivos no diretório raiz serão encontrados. .py
os arquivos nos subdiretórios nunca seriam encontrados porque rsync
nã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='*/'
?