Compreendendo os padrões de inclusão / exclusão do rsync

6

Eu quero transferir N arquivos de um sistema remoto usando um padrão:

ssh remote ls target/
2013-08-01.mjson.gz
2014-07-04.mjson.gz
2014-07-09.mjson.gz
2014-08-12.mjson.gz
...

Eu só quero os arquivos 2014-07* . Minhas tentativas até agora:

rsync -a --dry-run --verbose --include="2014-07-*" remote:target .
# transfers everything

rsync -a --dry-run --verbose --include="2014-07-*" --exclude="*" remote:target .
# transfers nothing

rsync -a --dry-run --verbose --exclude="*" --include="2014-07-*" remote:target .
# transfers nothing

rsync -a --dry-run --verbose --include="*/2014-07-*" --exclude="*" remote:target .
# transfers nothing

rsync -a --dry-run --verbose --include="***/2014-07-*" --exclude="*" remote:target .
# transfers nothing

Eu sei que posso usar --files-from para indicar quais arquivos exatamente eu quero, mas é difícil de fazer.

Eu nunca entendi como usar corretamente a inclusão / exclusão para fazer o que eu quero. A página man afirma:

and the first matching pattern is acted on: if it is an exclude pattern, then that file is skipped; if it is an include pattern then that filename is not skipped; if no matching pattern is found, then the filename is not skipped.

Lendo isto, presumi que, se include fosse o primeiro, e o nome do arquivo fosse correspondido, então "nome do arquivo não é pulado" parte iria aparecer. Aparentemente, eu estou errado.

Mais abaixo na página man, eu vejo:

Note that, when using the --recursive (-r) option (which is implied by -a), every subcomponent of every path is visited from the top down, so include/exclude patterns get applied recursively to each subcomponent’s full name

Como usei --recursive , isso causou que . fosse ignorado devido à exclusão global?

Como faço para transferir um subconjunto de arquivos usando padrões de inclusão e exclusão?

    
por François Beausoleil 26.08.2014 / 16:18

1 resposta

7

Embora você possa usar incluir e excluir, acho que essa seria uma solução mais simples:

rsync -a --dry-run --verbose remote:'target/2014-07*' .

O motivo pelo qual sua variante de inclusão / exclusão não funciona é que o rsync nunca desce ao diretório target , pois é excluído pelo padrão * e não corresponde ao padrão de inclusão (que corresponde apenas aos arquivos em target , não target em si). Para incluir / excluir no trabalho, você teria que fazer algo como

rsync -a --dry-run --verbose --include=target --include='target/2014-07-*' --exclude='*' remote:target .
    
por 26.08.2014 / 16:37

Tags