Eu quero sincronizar apenas certos tipos de arquivo (por exemplo .py
) e quero excluir arquivos em alguns diretórios (por exemplo venv
).
Isto é o que eu tentei:
rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Mas isso não funciona.
o que estou perdendo?
Também segui a resposta a esta pergunta, mas não ajudou.
--include='*/'
?Respostas:
venv/
precisa ser excluído antes da*/
inclusão:A sutileza é que
rsync
processa as regras em ordem e a primeira regra correspondente vence. Portanto, se--include='*/'
for anterior--exclude='venv/'
, o diretóriovenv/
será incluído--include='*/'
e a regra de exclusão nunca será consultada.Poderíamos simplificar isso?
O padrão é incluir arquivos / diretórios. Então, considere:
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 porquersync
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.fonte
--include='*/'
e--exclude='*'
? Por que apenas--exclude=venv/ --include='*.py'
não funciona?