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
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
?
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
XZ_OPT=-9e tar cJf tarfile.tar.xz directory
é ainda melhor que
XZ_OPT=-9 tar cJf tarfile.tar.xz directory
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).
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
tar
usa J
flag para arquivos xz. Um exemplo:
tar -cJvf foo.tar.xz foo/
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
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 .
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
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.
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.
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
Tags directory compression tar