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


63

Esta pergunta já tem uma resposta aqui:

A maneira como entendo o uso do tar + gzip é que tarnormalmente é usado para consolidar um agrupamento de arquivos em um único arquivo e depois gzipé usado para compactar esse arquivo.

Eu aprendi recentemente que tartambém pode comprimir.

Como eu não entendo completamente como a compactação funciona no núcleo, tenho preocupações (possivelmente ridículas) de que o envio de um .tar pré-compactado para o gzip possa impedir a compactação do gzip, assim como seu potencial permitiria e coisas dessa natureza.

Minha pergunta é essencialmente: que combinação de métodos args / compressão devo usar para criar o menor absoluto tar.gz e como é a declaração da linha de comando?


2
A compactação de arquivos já compactados pode reduzir seu tamanho ou aumentar o arquivo. Tudo depende do tipo de dados e de qualquer compactação sendo usada.
— Keltari

O que @Keltari disse. As taxas e proporções de compressão são altamente dependentes do que você está compactando, e é também por isso que existem diferentes algoritmos e métodos de compactação.
— music2myear

Respostas:


111

Ou, você pode dizer ao tar para a compressão máxima do usuário desta maneira:

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

Além disso, para manter seus envvars desorganizados, você pode fazer o seguinte:

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

43

Como você declarou - "o tar também pode comprimir ", implica que - tarnem sempre comprime os dados por si só.

Faz isso apenas quando usado com a zopção Isso também não por si só, mas - passando os dados tarredados pelo gzip.

No entanto, em vez disso, conforme observado nesta resposta, você pode canalizar os dois comandos: tar& para gzipque você possa especificar explicitamente o nível de compactação do gzipcomando para obter o menor tamanho de saída.

tar cvf - / caminho / para / diretório | gzip -9 -> arquivo.tar.gz

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


Eu tive um problema em que não é recursivo e reclama que será um arquivo vazio, já que o comando está dividido, é difícil encontrar como forçar corretamente a recursiva, já que já é o padrão do alcatrão. MEU RUIM, eu o especifiquei incorretamente, começando assimtar -cvf /path
— Brian Thomas

17

Normalmente, nem gzip nem tar podem criar "o menor absoluto tar.gz". Existem muitos utilitários de compactação que podem ser compactados no formato gz. Eu escrevi um script " gz99 " para tentar gzip, 7ze advdefpara obter o menor arquivo. Para usar isso para criar o menor arquivo possível, execute:

tar c path/to/data | gz99 file.gz

O advdefutilitário do AdvanceCOMP geralmente fornece o arquivo menor, mas também é com erros (o gz99utilitário verifica se não corrompeu o arquivo antes de aceitar a saída de advdef). Para usar advdefdiretamente, crie file.tar.gz como quiser. Então corra:

advdef -z -4 file.tar.gz

Isso criará um arquivo gz padrão que pode ser lido pelo gzip e tar normalmente, apenas um pouquinho menor. É o melhor que você pode fazer com o formato gz.

Como você aprendeu recentemente que o tar pode compactar e não disse por que deseja o menor arquivo ".tar.gz", talvez não saiba que existem formatos mais eficientes que podem ser usados ​​com arquivos tar, como o xz. Geralmente, mudar para um formato diferente pode proporcionar uma melhoria muito melhor na compactação do que brincar com as opções gzip. A principal desvantagem do xz é que ele não é tão comum quanto o gzip; portanto, as pessoas para quem você envia o arquivo precisam instalar um novo pacote. Também tende a ser um pouco mais lento, principalmente ao comprimir. Se isso não lhe interessa e você realmente deseja o menor arquivo tar, tente:

 tar cv path/to/data | xz -9 > file.tar.xz

Versões modernas do tar, por exemplo, no Ubuntu 13.10, detectam automaticamente arquivos compactados. Portanto, mesmo se você usar a compactação xz, ainda poderá descompactar como de costume:

 tar xvf file.tar.xz

Para ter uma idéia rápida de como esses utilitários de compactação se comparam, considere o efeito de compactar o patch-3.1.1 no 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 menor gz, precisamos do advdef (embora 7z -tgzip seja quase tão bom e muito menos bugs). Também vemos que mudar para xz nos dá muito mais espaço do que tentar extrair o máximo do antigo formato gz, sem que a compactação demore muito.


O OP perguntou como obter o máximo de compactação para um arquivo .tar.gz, mas você sugeriu a criação de um arquivo .tar.xz. Você está respondendo a uma pergunta diferente da solicitada.
— 22414 ChrisInEdmonton

Ah, eu vejo o que você está procurando. advdef simplesmente trava no meu sistema (v1.15), então 'advdef -z -4 file.tar.gz' não funciona, mas pelo menos teoricamente poderia. Não consigo encontrar evidências de que isso reduziria o arquivo além de 'gzip -9', mas poderia, e de qualquer forma, é suficiente para remover meu voto de -1. Obrigado por esclarecer!
— 22414 ChrisInEdmonton

Hmm, estou usando a v1.17. De qualquer forma, o matemático pedante em mim quer ressaltar que minha resposta provavelmente não é tecnicamente correta. Afinal, se você enumerar todos os arquivos gz possíveis do menor para o maior e escolher o primeiro que descompacta no arquivo correto, poderá economizar mais alguns bytes. Mas isso seria muito lento na prática.
— gmatht

Eu não acho que "buggy" e "archive" devam ser usados ​​juntos, de que utilidade um arquivo está corrompido? Você precisa de um arquivo muito maior para "comparar" os utilitários de compactação e também de diferentes tipos de arquivos de entrada - medir diferenças de centésimos de segundo não é tão confiável, acho que xz -9geralmente leva algo como 5x o gz -9tempo, e não apenas 1,5x sua mesa sugere.
— Xen2050 18/03/19

como podemos criar arquivos de divisão (enquanto comprimindo), utilizando o processo de xz favor
— nyxee

6
tar c /path/to/data | gzip --best > file.tar.gz

gzipA opção --best(equivalente a -9) solicita o nível mais alto de compactação.


4
Como alternativa, use o --bestsinalizador: -9 é confuso para o leitor.
— Om-nom-nom
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.