O rsync --include combina zero ou um caractere?

0

Pode

rsync -a --include="*.[Jj][Pp][Gg]" --include="*.[Jj][Pp][Ee][Gg]" --include="*.[Jj][Ff][Ii][Ff]" --exclude="*" tmp/a/* tmp/b/

ser simplificado para algo como

rsync -a --include="*.[Jj][PpFf][EIi]?[GgFf]" --exclude="*" tmp/a/* tmp/b/

para corresponder jpg .JFIF .jpeg como:

ls tmp/a/*.{J,j}{P,p,F,f}{I,i,E,e,}{G,g,F,f} 2>/dev/null

Eu criei um teste de exemplo que funciona, mas gostaria de combinar a correspondência de imagem e os includes em um --include sem o perigo de --include="*.[Jj][Pp]*[Gg]" que corresponde a foo.jp.png (que eu não quero copiar).

mkdir -p tmp/a; touch tmp/a/foo.jpeg; touch tmp/a/bar.jpg; rm tmp/b/*; rsync -a --include="*.[Jj][Pp][Gg]" --include="*.[Jj][Pp][Ee][Gg]" --include="*.[Jj][Ff][Ii][Ff]" --exclude="*" tmp/a/* tmp/b/ ; ls -la tmp/b

    
por Alexx Roche 16.10.2017 / 16:16

2 respostas

2

Talvez seja melhor usar uma ferramenta diferente para encontrar a lista de arquivos e, em seguida, conectá-los ao rsync. Por exemplo:

find /tmp/a -iregex '.*\(jpe?g\|jfif\)' | 
rsync -nav --files-from=- / /tmp/b

O -iregex significa ignorar o caso. O padrão regex tem um ^ implícito no início e $ no final. O tipo de regex padrão é emacs , daí a necessidade de barras invertidas.

(Eu deixei um -n no rsync para não copiar nada). Cuidado, usando --files-from implica -R , o que significa que o caminho completo, por exemplo tmp/a/t.jpg , será copiado para o destino, e é por isso que usei um caminho absoluto no find e como o rsync do diretório ( / ). Isso é apenas para simplificar o teste até você entender qual diretório inicial você precisa fornecer para localizar e rsync.

Por exemplo, para eliminar o prefixo tmp/a , você pode fazer (cd /tmp/a; find . ... ) | rsync ... /tmp/a /tmp/b . O achado gerará t.jpg e o rsync encontrará esse arquivo em /tmp/a e criará o arquivo t.jpg em /tmp/b .

    
por 16.10.2017 / 20:36
0

Eu gosto da resposta do meuh. Esta resposta explica por que a resposta do meuh é a maneira de fazer zero ou uma correspondência para rsync

Não acredito que o recurso de zero ou um esteja disponível na linha de comando rsync , de acordo com a INCLUDE/EXCLUDE PATTERN RULES na página rsync man.

rsync parece usar uma versão expandida da linha de comando do shell padrão correspondente ("globbing"), que é diferente da correspondência expressão regular .

O recurso zero-ou-um está disponível em correspondência estendida de padrões de alguns shells (a opção extglob em bash ), mas não vejo nenhuma discussão sobre isso ou similar < em> padrão estendido correspondente recursos na página rsync man.

    
por 16.10.2017 / 21:04

Tags