Como posso transferir dados excluindo arquivos com mais de 100 MB, mas incluindo arquivos com mais de 100 MB, se eles corresponderem a um padrão de extensões de arquivo conhecidas?

2

Como posso transferir dados excluindo arquivos com mais de 100 MB, mas incluindo arquivos com mais de 100 MB, se eles corresponderem a um padrão de extensões de arquivo conhecidas?

Eu li as opções do rsync e não acho que posso conseguir isso com o rsync, porque --max-size=não é flexível assim, mesmo em combinação com --includeou --exclude.

adampski
fonte

Respostas:

3

Em duas etapas (para simplificar, mesmo que essas etapas possam ser definitivamente combinadas).

Primeira transferência de arquivos "pequenos":

find /source/path -type f -size -100M -print0 |
rsync -av -0 --files-from=- / user@server:/destination/

Depois transfira os arquivos "grandes" cujos nomes de arquivos correspondem pattern:

find /source/path -type f -size +99M -name 'pattern' -print0 |
rsync -av -0 --files-from=- / user@server:/destination/

No entanto, isso não foi testado.

-print0em GNU find(e outros) vai imprimir os nomes encontrados com um nuldelimitador, e -0com rsyncfarão --files-from-interpretar esse fluxo de entrada padrão dessa forma particular.

Os caminhos de arquivo lidos com --files-fromdeve ser em relação à fonte especificada, é por isso que eu uso /como fonte em rsync(estou assumindo /source/pathem findé um caminho absoluto).


Variação combinada (também não testada):

find /source/path -type f \
    \( -size -100M -o -name 'pattern' \) -print0 |
rsync -av -0 --files-from=- / user@server:/destination/

Com mais de uma patternsequência permitida para arquivos "grandes":

find /source/path -type f \
    \( -size -100M -o -name 'pattern1' -o -name 'pattern2' -o -name 'pattern3' \) -print0 |
rsync -av -0 --files-from=- / user@server:/destination/

Cada um patternpode ser algo parecido com *.mp4as extensões de arquivo que você usa. Observe que eles precisam ser citados, como em -name '*.mp4'.

Kusalananda
fonte
Não sei ao certo por que você usou \(e \)entre o -sizepadrão final, mas funciona com e sem? De qualquer forma, este exemplo ainda está capturando arquivos que não correspondem ao padrão.
adampski
@adampski Você está se referindo ao meu último exemplo? Isso seria acionado para arquivos com tamanho inferior a 100 Mb ou para arquivos cujos nomes correspondam a qualquer um dos padrões. Os \( ... \)grupos da condicional de modo que -print0acontece para qualquer arquivo que corresponde a qualquer das condições.
Kusalananda
1
Ah, eu entendo agora. Eu notei que ainda era, -100Mentão eu assumi que isso era um erro e cometi +99M. No entanto, o "ou" na sua resposta é a parte principal das informações que me permite entender que está copiando todos os arquivos com menos de 100 milhões ou arquivos que correspondem ao padrão. Obrigado!
22418 adampski