O Rsync copia a (s) origem (s) para o destino. Se você passar *.pdf
como origens, o shell expandirá isso para a lista de arquivos com a extensão .pdf
no diretório atual. Nenhuma travessia recursiva acontece porque você não passou nenhum diretório como fonte.
Portanto, você precisa executar rsync -a ~/LaTeX/ ~/Output/
, mas com um filtro para informar ao rsync para copiar somente arquivos .pdf
. As regras de filtragem do Rsync podem parecer assustadoras quando você lê o manual, mas você pode construir muitos exemplos com apenas algumas regras simples.
-
Inclusões e exclusões:
- A exclusão de arquivos por nome ou por local é fácil:
--exclude=*~
,--exclude=/some/relative/location
(relativo ao argumento de origem, por exemplo, isso exclui~/LaTeX/some/relative/location
). - Se você quiser corresponder apenas alguns arquivos ou locais, inclua-os, inclua todos os diretórios que levam a eles (por exemplo, com
--include=*/
) e exclua o restante com--exclude='*'
. Isso porque: - Se você excluir um diretório, isso excluirá tudo abaixo dele. Os arquivos excluídos não serão considerados.
- Se você incluir um diretório, isso não incluirá automaticamente seu conteúdo. Nas versões recentes,
--include='directory/***'
fará isso. - Para cada arquivo, a primeira regra de correspondência se aplica (e qualquer coisa nunca correspondida é incluída).
- A exclusão de arquivos por nome ou por local é fácil:
-
Padrões:
- Se um padrão não contiver um
/
, ele será aplicado ao diretório sans do nome do arquivo. - Se um padrão terminar com
/
, ele será aplicado apenas aos diretórios. - Se um padrão começar com
/
, ele será aplicado a todo o caminho do diretório que foi passado como um argumento pararsync
. -
*
de qualquer substring de um único componente de diretório (isto é, nunca corresponde a/
);**
corresponde a qualquer substring de caminho.
- Se um padrão não contiver um
-
Se um argumento de origem terminar com
/
, seu conteúdo será copiado (rsync -r a/ b
criab/foo
para cadaa/foo
). Caso contrário, o próprio diretório será copiado (rsync -r a b
criab/a
).
Assim, aqui precisamos incluir *.pdf
, incluir diretórios que os contenham e excluir todo o resto.
rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Observe que isso copia todos os diretórios, mesmo aqueles que não contêm nenhum arquivo ou subdiretório correspondente contendo um. Isso pode ser evitado com a opção --prune-empty-dirs
(não é uma solução universal, já que você não pode copiar um diretório nem mesmo combinando-o explicitamente, mas esse é um requisito raro).
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/