Então, eu preciso compactar um diretório com a compactação máxima.
Como posso fazer isso xz
? Quero dizer, vou precisar tar
também porque não consigo compactar um diretório apenas xz
. Existe um oneliner para produzir, por exemplo foo.tar.xz
?
Então, eu preciso compactar um diretório com a compactação máxima.
Como posso fazer isso xz
? Quero dizer, vou precisar tar
também porque não consigo compactar um diretório apenas xz
. Existe um oneliner para produzir, por exemplo foo.tar.xz
?
Respostas:
Supondo que xz
honre 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
-9e
é o melhor nível, mas vai demorar muito tempo
-9e
nem sempre lhe dará o melhor resultado - consulte o ponto 8 aqui rootusers.com/13-simple-xz-examples
--threads=0
a xz
Com um GNU recente tar
no bash ou no shell derivado:
XZ_OPT=-9 tar cJf tarfile.tar.xz directory
o switch j minúsculo do tar usa bzip, o switch J maiúsculo usa xz.
A XZ_OPT
variável de ambiente permite definir xz
opções que não podem ser transmitidas por aplicativos de chamada como tar
.
Agora é o máximo .
Consulte man xz
outras opções que você pode definir ( -e
/ --extreme
pode fornecer benefícios adicionais de compactação para alguns conjuntos de dados).
XZ_OPT=-e9 tar cJf tarfile.tar.xz directory
rc
e akanga
. fish
, csh
, tcsh
E es
sendo os principais reservatórios que não suportam isso. Lá, você usaria o env
comando
-9
e -e
xz opts, você quer, XZ_OPT=-e9
mas como @krzyk apontou, -e é extremamente lento
XZ_OPT
não é um recurso implementado no tar
. É uma característica do xz
. Quando tar
chamadas xz
, a variável env é simplesmente transmitida.
XZ_OPT=-9e tar cJf tarfile.tar.xz directory
é ainda melhor que
XZ_OPT=-9 tar cJf tarfile.tar.xz directory
option -e, --extreme
Modifique a predefinição de compressão (-0 ... -9) para que seja possível obter uma taxa de compressão um pouco melhor sem aumentar o uso de memória do compressor ou descompressor (exceção: o uso de memória do compressor pode aumentar um pouco com as predefinições -0 ... -2). A desvantagem é que o tempo de compactação aumentará drasticamente (pode facilmente dobrar).
-9
não devo usá-lo -9e
, sim?
XZ_OPT="-9e -T0" tar -cJf ...
Se você tiver 16 GiB de RAM (e nada mais estiver em execução), poderá 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 adequadamente para quantidades menores de memória.
Isso só ajudará se os dados forem realmente grandes e, em qualquer caso, não ajudará MUITO , mas ainda assim ...
Se você estiver compactando binários, adicione --x86 como a primeira opção xz. Se você estiver reproduzindo arquivos "multimídia" (áudio não compactado ou bitmaps), poderá tentar com --delta = dist = 2 (experimente com valor, bons valores para tentar são 1..4).
Se você estiver se sentindo muito aventureiro, tente jogar com mais opções de LZMA, como
--lzma2=dict=1536Mi,nice=273,lc=3,lp=0,pb=2
(essas 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 são mapeadas para esses valores, você pode verificar o arquivo de origem src / liblzma / lzma / lzma_encoder_presets.c. Nada de muito interesse lá (-e define o bom comprimento para 273 e também ajusta a profundidade).
Você pode tentar opções diferentes, 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
Portanto, 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
no difference = 660 4e better than 9e = 74 9e better than 4e = 17 total files = 751 tar 2 html 2 csv 2 xml 2 gz 2 ppt 2 eps 2 docx 2 gif 2 rpm 3 png 3 asv 3 xlsx 3 exe 3 rar 4 nc 4 txt 5 odt 6 xls 7 zip 7 doc 9 m 12 dat 17 other 109 pdf 133 135 jpg 270
txt 109 txt/pdf 135
tar
arquivos usando xz
.
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/
descomprimir compressores externos:
tar -I lz4 -xvf foo.tar.lz4
tar -I zstd -xvf foo.tar.zst
lista de compressores externos de arquivo morto:
tar -I lz4 -tvf foo.tar.lz4
tar -I zstd -tvf foo.tar.zst
-I
adicionada.
tar
O comando usa J
sinalizador para arquivos xz. Um exemplo:
tar -cJvf foo.tar.xz foo/
J
já foi mencionado na resposta do bdowning
Para os interessados, -e9
é 0,4% menor, 20% mais lento na compressão, 3% mais lento na descompressão, em comparação com -9
um laptop típico. Aqui está o tempo executado na estrutura do diretório de código fonte do Python.
Compressão:
$ Tbefore=`date +%s%3N` && XZ_OPT=-9 tar cJf python3.6.tar.9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
43.87
$ Tbefore=`date +%s%3N` && XZ_OPT=-e9 tar cJf python3.6.tar.e9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
53.861
Descompressão:
$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)" && rm -rf Python-3.6.0
1.395
$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.e9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)" && rm -rf Python-3.6.0
1.443
Tamanho do arquivo:
$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf Python-3.6.0.tar.xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 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
Esta não é uma resposta exata para 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" para arquivar archive.7z usando "ultras ettings"
outros formatos suportados são: zip, gzip, bzip2 ou tar. para isso basta substituir 7z
depois -t
.
--fonteman 7z
NOTA: não use este comando para fazer backup dos arquivos do sistema, exceto os arquivos pessoais, porque o formato 7z não armazena as permissões do sistema de arquivos .
Em uma máquina multicore da versão v5.2.0 do xz-utils, verifique:
-T, --threads=NUM use at most NUM threads; the default is 1; set to 0
Se você deseja usar o número máximo de núcleos e a compressão máxima:
export XZ_DEFAULTS="-9 -T 0 "
Ou defina -T para o número de núcleos que você deseja usar.
Então:
tar cJf target.tar.xz source
Além disso, isso pode ser útil para escolher o nível de compactação:
Se você deseja que isso seja concluído mais rapidamente, usando vários encadeamentos, mas sem desacelerar o sistema enquanto você executa outro trabalho, tente adicionar -Tn
onde n é quantos encadeamentos você deseja usar, além nice
de rebaixar a compactação para a prioridade ociosa.
Modelo (para 4 linhas):
tar c foo/ | nice -n19 xz -9 -T4 > foo.tar.xz
Tente assistir top
ou htop
quando você fizer isso em um grande diretório (vários GB). Esperamos que você veja vários xz
threads com o valor Nice de 19 (prioridade mais baixa).
Eu também reduzi isso de maneira mais concisa e sensível, como: as -f -
outras respostas simplesmente não são necessárias, pois tar
a saída padrão é stdout.
Você também pode nice
executar o processo tar, mas nunca achei necessário, pois xz
sempre afunila a CPU do pipeline.
Nota prática, eu raramente uso xz -9
para qualquer coisa, não tanto devido à CPU ou ao tempo, mas devido às altas demandas de memória. Dê uma olhada em https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO#Memory_requirements_on_compression . O xz
compressor, assim bzip2
como o contrário gzip
, usa mais memória para fatores de compressão mais altos. Juntando isso, que xz
usa muito mais memória do que qualquer outro compressor, você pode usar facilmente mais de 600 MB de memória. E se você usar o -T
para ativar a compactação encadeada, as demandas de memória aumentam ainda mais. Apenas algo a ter em conta, como se você estiver executando algum serviço pequeno em uma pequena VM com memória de 1-2 GB, poderá causar um impacto inadvertido.
man 1 xz
dizit's not a good idea to blindly use -9 for everything like it often is with gzip(1) and bzip2(1).
-7 ... -9 [...] These are useful only when compressing files bigger than 8 MiB, 16 MiB, and 32 MiB, respectively.
RTFM para mais informações.