2012-12-01 20:47:48 +0000 2012-12-01 20:47:48 +0000
67
67

Como obter a compressão máxima com .tar.gz?

A forma como entendo o uso de alcatrão + gzip é que tar é normalmente utilizado para consolidar um agrupamento de ficheiros num único ficheiro, depois gzip é utilizado para comprimir esse ficheiro.

Recentemente descobri que tar também pode comprimir.

Porque não compreendo bem como funciona a compressão no seu núcleo, tenho (possivelmente ridículo) preocupações de que o envio de um .tar pré-comprimido para o gzip possa impedir o gzip de comprimir, bem como o seu potencial, e coisas dessa natureza.

A minha pergunta é essencialmente: Que combinação de args/métodos de compressão devo usar para criar o mais pequeno tar.gz absoluto, e como é a declaração de linha de comando para isso?

Respostas (4)

118
118
118
2013-01-31 18:55:22 +0000

Ou, pode dizer alcatrão ao utilizador compressão máxima desta forma:

export GZIP=-9
tar cvzf file.tar.gz /path/to/directory

Adicionalmente, para manter os seus invejosos livres de desordens, pode fazer isto:

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
44
44
44
2012-12-02 03:37:18 +0000

Como afirma - “tar pode também comprimir”, implica que - tar não comprime sempre dados por si só.

Só o faz quando utilizado com a opção z. Isto também não por si só, mas - passando os dados de alcatrão através do gzip.

No entanto, em vez disso, como se observa em isto responder, é possível canalizar os dois comandos: tar & gzip de modo a poder especificar explicitamente o nível de compressão para o comando gzip para atingir o menor tamanho de saída.

tar cvf - /caminho/para/directório | gzip -9 - > file.tar.gz

Aqui 9 especifica o nível de compressão máximo possível.

17
17
17
2014-03-10 15:23:08 +0000

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.

6
6
6
2014-02-06 18:25:54 +0000
tar c /path/to/data | gzip --best > file.tar.gz

gzip opção --best (equivalente a -9) pede o mais alto nível de compressão.