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.