Gzip milhares de arquivos eficientemente em uma única passagem

2

Eu quero compactar o conteúdo de alguns milhares de arquivos minúsculos em um único arquivo. Embora eu pudesse fazer isso com algo como for file in $(find . -iname 'pattern'); do; cat $file | gzip - >> zipped.gz; done; , isso resulta em uma compactação muito ruim na primeira tentativa. Enquanto rezipping é muito fácil com zcat zipped.gz | gzip --best > rezipped.gz Gostaria de saber se alguém sabe uma boa maneira de fazer isso em uma única passagem.

    
por Nick 26.09.2014 / 01:57

2 respostas

3

Quando se descobriu que o melhor comportamento é quando você coloca todos os arquivos em um único fluxo, eu estava descobrindo as coisas com um loop. Mas então percebi que há uma maneira ainda mais fácil (e melhor):

find . -iname 'pattern' -exec cat {} \; | gzip --best - > file.gz

Todas as invocações de cat irão para o stdout de find, há apenas uma invocação de gzip. Rezipar o resultado produz o mesmo tamanho de arquivo. Você pode conseguir um resultado ainda melhor (em termos de número de invocações de gato, não em tamanho de arquivo) se você usar a + versão de -exec (veja a página man find), mas eu não testei isso.

    
por 30.09.2014 / 16:04
1
find . -iname 'pattern' | xargs gzip -9 -v

EDITAR

Parece que, quando você gata, o arquivo gzip é mais capaz de compactá-lo.

Isso pode funcionar:

for TXT in $(find /PATH/TO/TXT/FILES -iname '*.txt'); do cat ${TXT} | gzip -9 > ${TXT}.gz; done

No meu mac, o arquivo de texto original não foi removido. Assim, tanto o arquivo de texto original quanto o arquivo zipado estavam presentes após a execução do script.

Você pode adicionar facilmente

rm -f /PAHT/TO/TXT/FILES/${TXT}

para o loop para se livrar dos arquivos de texto simples.

    
por 26.09.2014 / 05:10

Tags