Normalmente nem o gzip nem o alcatrão podem criar “o mais pequeno alcatrão.gz absoluto”. Há muitos utilitários de compressão que podem comprimir para o formato gz. Escrevi um guião bash gz99 “ para tentar gzip
, 7z
e advdef
para obter o ficheiro mais pequeno. Para usar isto para criar o ficheiro mais pequeno possível:
tar c path/to/data | gz99 file.gz
O utilitário advdef
do AdvanceCOMP geralmente dá o ficheiro mais pequeno, mas também é buggy (o utilitário gz99
verifica se não corrompeu o ficheiro antes de aceitar a saída de advdef
). Para usar advdef
directamente, crie file.tar.gz como lhe apetecer. Depois execute:
advdef -z -4 file.tar.gz
Isto irá criar um ficheiro gz padrão que pode ser lido por gzip e tar como normal, apenas um pouco mais pequeno. Isto é o melhor que se pode fazer com o formato gz.
Uma vez que só recentemente aprendeu que o alcatrão pode comprimir, e não disse porque queria o mais pequeno ficheiro ”.tar.gz", pode não saber que existem formatos mais eficientes que podem ser utilizados com ficheiros de alcatrão, tais como xz. Geralmente, a mudança para um formato diferente pode dar uma melhoria muito melhor na compressão do que o fiddling round com opções gzip. A principal desvantagem do xz é que não é tão comum como o gzip, pelo que as pessoas a quem envia o ficheiro poderão ter de instalar um novo pacote. Também tende a ser um pouco mais lento, particularmente quando se comprime. Se isto não lhe interessa, e quer mesmo o ficheiro de alcatrão mais pequeno, tente:
tar cv path/to/data | xz -9 > file.tar.xz
Versões modernas de alcatrão, por exemplo no Ubuntu 13.10, detectam automaticamente os ficheiros comprimidos. Assim, mesmo que utilize compressão xz, ainda pode descomprimir como habitualmente:
tar xvf file.tar.xz
Para dar uma rápida ideia de como estes utilitários de compressão se comparam, considere o efeito de compressão patch-3.1.1 a partir do kernel do linux:
utility cpu format size(bytes)
gzip -9 0.02s gz 105,628
advdef -2 0.07s gz 102,619
7z -mx=9 -tgzip 0.42s gz 102,297
advdef -3 0.55s gz 102,290
advdef -4 0.75s gz 101,956
xz -9 0.03s xz 91,064
xz -3e 0.15s xz 90,996
Neste exemplo trivial, vemos que para obter o mais pequeno gz precisamos de advdef (embora 7z -tgzip seja quase tão bom e muito menos buggy). Vemos também que mudar para xz nos dá muito mais espaço do que tentar espremer ao máximo o antigo formato gz, sem que a compressão demore muito tempo.