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

142

Gzip diretórios muitas vezes 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 compactação aqui? Eu quero usar a melhor compactação possível, mesmo que demore mais tempo para compactar.

lazer
fonte

Respostas:

142
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 uma melhor compactação, não use o gzip. Use lzma ou 7z.

E ao usar o gzip (que é uma boa ideia por várias razões) considere usar o pigzprograma e não o gzip.


fonte
14
pigz é o "gzip paralelo", que usa todos os seus núcleos para a compressão gzip. Você pode assistir tope vê-lo usando algo entre 200% -400 $ CPU.
Felipe Alvarez
2
FYI, para o formato .bz2, use: BZIP2 = -9 tar cvjf file.tar.bz2 / caminho / para / diretório
Tomofumi 2/17/17:
3
A variável de ambiente parece ser agora GZIP_OPT, o uso deve ser o mesmo.
Seer
3
Na página de manual no Ubuntu 16.04 para gzip: "No Vax / VMS, o nome da variável de ambiente é GZIP_OPT, para evitar um conflito com o conjunto de símbolos para a invocação do programa." Para sh, csh, e MSDOS deve ainda ser apenas GZIP
Ponyboy47
68

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 do programa gzip:

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

Ou você pode 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 compactação possível (o padrão é -6).

Edit: Corrigida a linha de comando do pipe com base no comentário @depesz.

Matrix Mole
fonte
4
O uso de pipes deve ser feito com:tar cvf - /path/to/directory | gzip -9 - > file.tar.gz
1
O primeiro exemplo deve terminar com file.tar, pois gzipadiciona a extensão ".gz".
bonsaiviking
4
por que você não pula f -? Se não houver nenhum arquivo, então é stdin / out
akostadinov
além do comentário anterior. Na seção "man tar" Ambiente: TAPE Dispositivo ou arquivo a ser usado para o archive se --file não for especificado. Se essa variável de ambiente não estiver definida, use stdin ou stdout.
Mikl 24/09/13
2
e podemos reduzir "gzip -9 -" -> "gzip -9". Na seção "man gzip" Descrição: se nenhum arquivo for especificado ou se o nome de um arquivo for "-", a entrada padrão será compactada na saída padrão.
Mikl
53

As versões modernas do tar suportam o formato de arquivo xz (tar GNU, desde 1,22 em 2009, Busybox desde 1,17.0, em 2010).

É baseado no lzma2 , como uma versão 7-Zip do gz . Isso proporciona uma melhor compactação se você estiver de acordo com o requisito de precisar do suporte ao xz.

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

Eu acabei de descobrir aqui (basicamente um truque dessa pergunta, mas no Unix stackexchange) que também há uma variável de ambiente XZ_OPT = -9 para controlar o nível de compactação XZ semelhante ao GZIP no outro post.

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory
David C. Bishop
fonte
2
+1 xz é muito melhor que o bzip2 e o gzip. Aqui está uma comparação: tukaani.org/lzma/benchmarks.html
User1
8
O trade-off é a velocidade. XZ é significativamente mais lento.
6603 Bell
32
tar cv /path/to/directory | gzip --best > file.tar.gz

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

Ao chamar o tar, a opção findica que a saída é um arquivo. A configuração para -(stdout) faz com que o tar grave sua saída para stdout, que é o comportamento padrão sem os dois fe -.

E como declarado na gzippágina de manual, se nenhum arquivo for especificado, o gzip será compactado a partir da entrada padrão. Não há necessidade -na gzipligação.

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

Carlito
fonte
1
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 fosse óbvio, "-9" é a melhor compactação e "-1" é a compactação mais rápida. "-1" ainda leva um longo tempo se você tiver muitos arquivos ;-)
PJ Brunet
Isso funciona com xze pixztambém. É uma ótima maneira de controlar o número de threads usados ​​para compactação paralela sem precisar criar um arquivo .tar intermediário. Como assimtar -cv /path/to/dir | pixz -p4 > output.tpxz
joelostblom
10

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
Chris Gibson
fonte
2
Versões mais antigas do tar, como as fornecidas no CentOS 6 e 7, não suportam o fornecimento de argumentos no -Iarg, elas tentam tratar a coisa toda como um nome de programa para exec e, portanto, falham. Pelo menos a partir do tar 1.29 no Debian Stretch, isso funciona.
Cheetah
2

E, claro, o tar derivado do macOS bsd deve ser diferente:

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
rfay
fonte