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.