Como XZ um diretório com TAR usando compactação máxima?

97

Então eu preciso compactar um diretório com compactação máxima.

Como posso fazer isso com xz ? Quer dizer, eu vou precisar de tar também porque não posso compactar um diretório com apenas xz . Existe um oneliner para produzir, e. foo.tar.xz ?

    
por LanceBaynes 12.01.2012 / 22:23

11 respostas

72

Assumindo que xz respeita o conjunto padrão de sinalizadores de linha de comando - incluindo sinalizadores de nível de compactação, você pode tentar:

tar -cf - foo/ | xz -9 -c - > foo.tar.xz 
    
por 12.01.2012 / 22:34
131

Com um% GNU tar no shell bash ou derivado:

XZ_OPT=-9 tar cJf tarfile.tar.xz directory
O switch j minúsculo do tar p usa o bzip, o switch J maiúsculo usa xz.

A variável de ambiente XZ_OPT permite definir xz opções que não podem ser passadas por meio de aplicativos de chamada, como tar .

Isso agora é máximo .

Veja man xz para outras opções que você pode definir ( -e / --extreme pode dar a você algum benefício de compressão adicional para alguns conjuntos de dados).

XZ_OPT=-e9 tar cJf tarfile.tar.xz directory
    
por 12.01.2012 / 22:32
11
XZ_OPT=-9e tar cJf tarfile.tar.xz directory

é ainda melhor que

XZ_OPT=-9 tar cJf tarfile.tar.xz directory
    
por 12.12.2014 / 00:32
8

Se você tem 16 GiB de RAM (e nada mais rodando), você pode tentar:

tar -cf - foo/ | xz --lzma2=dict=1536Mi,nice=273 -c - > foo.tar.xz 

Isso precisará de 1.5 GiB para descompactação e cerca de 11x para compactação. Ajuste de acordo para quantidades menores de memória.

Isso só ajudará se os dados forem realmente tão grandes e, em qualquer caso, isso não ajudará muito, mas ainda assim ...

Se você está compactando binários, adicione --x86 como a primeira opção xz. Se você estiver jogando com arquivos "multimídia" (áudio não compactado ou bitmaps), você pode tentar com --delta = dist = 2 (experimente com valor, bons valores para tentar são 1..4).

Se você está se sentindo muito aventureiro, pode tentar jogar com mais opções de LZMA, como

--lzma2=dict=1536Mi,nice=273,lc=3,lp=0,pb=2

(estas são as configurações padrão, você pode tentar valores entre 0 e 4, e lc + lp não deve exceder 4)

Para ver como as predefinições padrão mapeiam esses valores, você pode verificar o arquivo de origem src / liblzma / lzma / lzma_encoder_presets.c. Nada de muito interesse ali (-e define o bom tamanho para 273 e também ajusta a profundidade).

    
por 18.12.2015 / 17:09
5

Você pode tentar diferentes opções, para mim -4e funciona melhor

tar cf - wam_GG_${dir}.nc | xz -4e > wam_GG_${dir}.nc.tar.xz 

Eu testei executando:

$ tar -cf - wam_GG.nc | xz -4e > wam_GG.nc.xz
$ tar -cf - wam_GG.nc | xz -9e > wam_GG.nc.xz.2

Então, parece que a opção -4e funciona um pouco melhor que -9e.

$ ll wam_GG.nc.xz*
-rw-rw-r--. 1 504 504 2707596 Jan 16  2015 wam_GG.nc.xz
-rw-rw-r--. 1 504 504 2708416 Jan 16  2015 wam_GG.nc.xz.2
    
por 16.01.2015 / 09:21
4
O comando

tar usa J flag para arquivos xz. Um exemplo:

tar -cJvf foo.tar.xz foo/

    
por 08.01.2014 / 23:37
4

tar --help : -I, --use-compress-program=PROG

tar -I 'xz -9' -cvf foo.tar.xz foo/  
tar -I 'gzip -9' -cvf foo.tar.gz foo/    

também comprima com compressores externos:

tar -I 'lz4 -9' -cvf foo.tar.lz4 foo/
tar -I 'zstd -19' -cvf foo.tar.zst foo/

descomprima compressores externos:

tar -I lz4 -xvf foo.tar.lz4  
tar -I zstd -xvf foo.tar.zst  

lista de compressores externos de arquivo:

tar -I lz4 -tvf foo.tar.lz4
tar -I zstd -tvf foo.tar.zst
    
por 27.10.2017 / 16:28
2

Esta não é uma resposta exata para a sua pergunta, mas você pode usar um comando em vez de dois:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z dir1

adiciona todos os arquivos do diretório "dir1" ao archive archive.7z usando "ultras ettings"

outros formatos suportados são: zip, gzip, bzip2 ou tar. para isso, basta substituir 7z após -t .
--source man 7z

NOTA: não use este comando para fazer backup de seus arquivos de sistema exceto arquivos pessoais porque o formato 7z não armazena as permissões do sistema de arquivos .

    
por 28.04.2015 / 08:56
2

Para os interessados, -e9 é 0,4% menor, 20% mais lento na compactação, 3% mais lenta na descompactação, comparado a -9 em um laptop comum. Aqui está o tempo de execução na estrutura de diretórios do código fonte do Python.

Compressão:

$ T0='date +%s%3N' && XZ_OPT=-9 tar cJf python3.6.tar.9xz Python-3.6.0 && T1='date +%s%3N'
$ python -c "print((float($T1) - float($T0)) / 1000.)"
43.87
$ T0='date +%s%3N' && XZ_OPT=-e9 tar cJf python3.6.tar.e9xz Python-3.6.0 && T1='date +%s%3N'
$ python -c "print((float($T1) - float($T0)) / 1000.)"
53.861

Descompressão:

$ T0='date +%s%3N' && tar xf python3.6.tar.9xz && T1='date +%s%3N'
$ python -c "print((float($T1) - float($T0)) / 1000.)"  && rm -rf Python-3.6.0
1.395
$ rm -rf Python-3.6.0
$ T0='date +%s%3N' && tar xf python3.6.tar.e9xz && T1='date +%s%3N'
$ python -c "print((float($T1) - float($T0)) / 1000.)"  && rm -rf Python-3.6.0
1.443

Tamanho do arquivo:

$ rm -rf Python-3.6.0
$ T0='date +%s%3N' && tar xf Python-3.6.0.tar.xz && T1='date +%s%3N'
$ python -c "print((float($T1) - float($T0)) / 1000.)" && rm -rf Python-3.6.0
1.49
$ ls -al ?ython*
-rw-rw-r-- 1 hobs hobs 16378500 Dec 23 13:06 python3.6.tar.9xz
-rw-rw-r-- 1 hobs hobs 16314420 Dec 23 13:05 python3.6.tar.e9xz
-rw-rw-r-- 1 hobs hobs 16805836 Dec 23 12:24 Python-3.6.0.tar.xz
    
por 23.12.2016 / 22:35
1

Se você deseja que isso seja concluído mais rapidamente, usando vários segmentos, mas sem abrandar o sistema enquanto executa outro trabalho, tente adicionar -Tn , em que n é quantos segmentos você deseja usar, bem como nice para rebaixar a compactação para a prioridade ociosa.

Model (para 4 threads):

tar c foo/ | nice -n19 xz -9 -T4 > foo.tar.xz

Tente assistir em top ou htop quando fizer isso em um diretório grande (vários GB). Espero que você veja vários encadeamentos xz com valor Nice de 19 (prioridade mais baixa).

Eu também desmembramento é tão conciso quanto sensato, como: o -f - em outras respostas simplesmente não é necessário, já que a saída padrão do tar é stdout.

Você também pode nice do processo tar, mas nunca achei necessário, pois xz sempre restringe a CPU para o pipeline.

Nota prática, eu raramente uso xz -9 para nada, nem tanto devido à CPU ou ao tempo, mas devido às altas demandas de memória. Dê uma olhada no link . O compressor xz , como bzip2 , mas ao contrário de gzip , usa mais memória para fatores de compactação mais altos. Coloque isso junto com o fato de que xz usa muito mais memória do que qualquer outro compressor, você pode facilmente usar até 600 MB de memória. E se você usar o -T para ativar a compactação encadeada, as demandas de memória aumentarão ainda mais. Apenas algo para estar ciente, como se você estivesse executando algum serviço pequeno em uma pequena VM com memória de 1-2 GB, você poderia inadvertidamente causar um impacto.

    
por 25.01.2017 / 20:47
0

No Mac OS X, uma abordagem alternativa para passar o parâmetro com tar é usar um sinalizador --options= . Por exemplo,

tar Jcvf targetFileName.tar.xz --options='compression-level=9' directoryName
    
por 30.08.2017 / 19:05