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
?
directory
tar
compression
LanceBaynes
fonte
fonte
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.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:fonte
-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 xzCom um GNU recente
tar
no bash ou no shell derivado:o switch j minúsculo do tar usa bzip, o switch J maiúsculo usa xz.
A
XZ_OPT
variável de ambiente permite definirxz
opções que não podem ser transmitidas por aplicativos de chamada comotar
.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).fonte
rc
eakanga
.fish
,csh
,tcsh
Ees
sendo os principais reservatórios que não suportam isso. Lá, você usaria oenv
comando-9
e-e
xz opts, você quer,XZ_OPT=-e9
mas como @krzyk apontou, -e é extremamente lentoXZ_OPT
não é um recurso implementado notar
. É uma característica doxz
. Quandotar
chamadasxz
, a variável env é simplesmente transmitida.é ainda melhor que
fonte
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:
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
(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).
fonte
Você pode tentar opções diferentes, para mim -4e funciona melhor
Eu testei executando:
Portanto, parece que a opção -4e funciona um pouco melhor que -9e.
fonte
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 usandoxz
.tar --help
:-I, --use-compress-program=PROG
também comprima com compressores externos:
descomprimir compressores externos:
lista de compressores externos de arquivo morto:
fonte
-I
adicionada.tar
O comando usaJ
sinalizador para arquivos xz. Um exemplo:tar -cJvf foo.tar.xz foo/
fonte
J
já foi mencionado na resposta do bdowningPara 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:
Descompressão:
Tamanho do arquivo:
fonte
Esta não é uma resposta exata para sua pergunta, mas você pode usar um comando em vez de dois:
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
.--fonte
man 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 .
fonte
Em uma máquina multicore da versão v5.2.0 do xz-utils, verifique:
Se você deseja usar o número máximo de núcleos e a compressão máxima:
Ou defina -T para o número de núcleos que você deseja usar.
Então:
Além disso, isso pode ser útil para escolher o nível de compactação:
https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO
fonte
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émnice
de rebaixar a compactação para a prioridade ociosa.Modelo (para 4 linhas):
Tente assistir
top
ouhtop
quando você fizer isso em um grande diretório (vários GB). Esperamos que você veja váriosxz
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, poistar
a saída padrão é stdout.Você também pode
nice
executar o processo tar, mas nunca achei necessário, poisxz
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 . Oxz
compressor, assimbzip2
como o contráriogzip
, usa mais memória para fatores de compressão mais altos. Juntando isso, quexz
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.fonte
No Mac OS X, uma abordagem alternativa para passar o parâmetro
tar
é usar um--options=
sinalizador. Por exemplo,fonte