Rsync, inclui apenas determinados tipos de arquivos, excluindo alguns diretórios

7

Desejo rsync apenas determinados tipos de arquivo (por exemplo, .py ) e desejo excluir arquivos em alguns diretórios (por exemplo, venv ).

Isso é 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 para pergunta mas não ajudou.

    
por CentAu 04.09.2016 / 23:12

1 resposta

9

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.

    
por 04.09.2016 / 23:20