Questão Como especificar o nível de compactação ao usar tar -zcvf?


Eu gzip diretórios muito frequentemente no trabalho. O que eu normalmente faço é

tar -zcvf file.tar.gz /path/to/directory

Existe uma maneira de especificar o nível de compressão aqui? Eu quero usar a melhor compactação possível mesmo que demore mais tempo para compactar.


121


origem




Respostas:


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

supondo que você esteja usando o bash. Geralmente, defina a variável de ambiente GZIP como "-9" e execute o tar normalmente.

Além disso - se você realmente deseja a melhor compactação, não use o gzip. Use lzma ou 7z.

E quando usar o gzip (o que é uma boa idéia por várias razões), considere usar pigz programa e não o gzip.


116



o pigz é mais rápido. Isso é tudo. Eu não vejo muito sentido em ter compressão demorar mais tempo, enquanto o resultado final é praticamente o mesmo.
É -9 de propósito ou um erro de digitação? - Jürgen Paul
De propósito. Esta é especificamente a resposta à pergunta do OP.
O pigz é "gzip paralelo", que usa todos os seus núcleos para compactação gzip. Você pode assistir top e vê-lo usando em qualquer lugar entre 200% -400 $ CPU. - Felipe Alvarez
A variável do ambiente parece ser agora GZIP_OPT, o uso deve ser o mesmo. - Seer


Em vez de usar o sinalizador gzip para tar, gzip os arquivos manualmente após o processo tar, você pode especificar o nível de compactação para o programa gzip:

tar -cvf files.tar /path/to/file0 /path/to/file1 ; gzip -9 files.tar

Ou você poderia usar:

tar cvf - /path/to/file0 /path/to/file1 | gzip -9 - > files.tar.gz

O -9 na linha de comando gzip diz ao gzip para usar o nível máximo de compressão possível (o padrão é -6).

Editar: Linha de comando de cano fixo baseada no comentário de @depesz.


62



O uso de pipes deve ser feito com: tar cvf - /path/to/directory | gzip -9 - > file.tar.gz
O primeiro exemplo deve terminar com file.tar, Desde a gzip adiciona a extensão ".gz". - bonsaiviking
por que você não pula f -? se não houver arquivo, então é stdin / out - akostadinov
além do comentário previos. Da seção "man tar" Environtment: TAPE Dispositivo ou arquivo a ser usado para o arquivo se --file não for especificado. Se esta variável de ambiente não estiver definida, use stdin ou stdout. - Mikl
e nós podemos reduzir "gzip -9 -" -> "gzip -9". Da seção "man gzip" Descrição: Se nenhum arquivo for especificado, ou se o nome do arquivo for "-", a entrada padrão será compactada na saída padrão. - Mikl


Versões modernas de tar suportam o formato de arquivo xz (GNU tar, desde 1,22 em 2009, o Busybox desde 1.17.0 em 2010).

É baseado em lzma2, tipo como um 7-Zip versão de gz. Isso oferece melhor compactação se você estiver satisfeito com o requisito de precisar de suporte ao xz.

tar -Jcvf file.tar.xz /path/to/directory

Eu acabei de descobrir Aqui (basicamente um dupe desta questão, mas no Unix stackexchange) que também existe uma variável de ambiente XZ_OPT = -9 para controlar o nível de compressão XZ similar ao GZIP no outro post.

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory

43



+1 xz é muito melhor que o bzip2 e o gzip. Aqui está uma comparação: tukaani.org/lzma/benchmarks.html - User1
O trade-off é a velocidade. XZ é significativamente Mais devagar. - Bell


tar cv /path/to/directory | gzip --best > file.tar.gz

Esta é a segunda solução da Matrix Mole, mas ligeiramente encurtada:

Ao chamar tar, opção f afirma que a saída é um arquivo. Configurando para - (stdout) faz o tar gravar sua saída para stdout, que é o comportamento padrão sem os dois f e -.

E como afirmado pelo gzip man page, se nenhum arquivo for especificado, o gzip será compactado a partir da entrada padrão. Não há necessidade de - no gzip ligar.

Opção --best (equivalente a -9) define o nível de compressão mais alto.


25



Isso funciona lindamente. Além disso, se você executar como root, as permissões e os proprietários também serão preservados. Caso contrário, você deve especificar. Além disso, se não for óbvio, "-9" é a melhor compactação e "-1" é a compactação mais rápida. "-1" ainda leva muito tempo se você tiver muitos arquivos ;-) - PJ Brunet
Isso funciona com xz e pixz também. É uma ótima maneira de controlar o número de encadeamentos usados ​​para compactação paralela sem ter que criar um arquivo .tar intermediário. Igual a tar -cv /path/to/dir | pixz -p4 > output.tpxz - Joel Ostblom


Há também a opção de especificar o programa de compactação usando -I. Isso pode incluir a opção de nível de compactação.

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory

9



Versões mais antigas do tar, como as fornecidas no CentOS 6 e 7, não suportam fornecer argumentos no -I arg, eles vão tentar tratar a coisa toda como um nome de programa para exec e, portanto, falhar. Pelo menos a partir do tar 1.29 no Debian Stretch, isso funciona. - Cheetah