Comment XZ un répertoire avec TAR utilisant la compression maximale?


116

J'ai donc besoin de compresser un répertoire avec une compression maximale.

Comment puis-je le faire avec xz? Je veux dire que j'en aurai besoin taraussi car je ne peux pas compresser un répertoire avec seulement xz. Y at-il un oneliner à produire par exemple foo.tar.xz?


11
FWIW, man 1 xzdit it'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 pour plus d’informations.
cychoi

Réponses:


82

En supposant que vous respectiez xzl’ensemble standard d’indicateurs de ligne de commande, y compris les indicateurs de niveau de compression, vous pouvez essayer:

tar -cf - foo/ | xz -9 -c - > foo.tar.xz 

et cela utilise le niveau de compression maximum avec XZ?
LanceBaynes

3
ajouter -9 à xz le rendra max
bsd

23
-9eest le meilleur niveau, mais cela prendra très longtemps
Krzysztof Krasoń

-9ene vous donnera pas toujours le meilleur résultat - voir le point 8 ici. rootusers.com/13-simple-xz-examples
KolonUK

1
En outre, vous pourriez voir une amélioration significative si vous ajoutez --threads=0à xz
KolonUK

146

Avec une version récente de GNU tarsur un shell bash ou dérivé:

XZ_OPT=-9 tar cJf tarfile.tar.xz directory

le commutateur j minuscule de tar utilise bzip, le commutateur J majuscule utilise xz.

La XZ_OPTvariable d'environnement vous permet de définir des xzoptions qui ne peuvent pas être transmises via des applications appelantes telles que tar.

C'est maintenant maximal .

Reportez-vous man xzaux autres options que vous pouvez définir ( -e/ --extreme pourrait vous apporter des avantages supplémentaires en termes de compression pour certains jeux de données).

XZ_OPT=-e9 tar cJf tarfile.tar.xz directory

27
Non, tu ne le fais pas. Exactement. Vous pouvez définir la variable d'environnement pour cette invocation. Vous pouvez l'exporter si vous le souhaitez, mais ce n'est pas obligatoire.
bsd

2
Vous supposez une coquille bash pour cela.
anddam

7
@anddam, soutenu par tous les obus de la famille Bourne (Bourne, ksh, mksh, pdksh, frêne, dash, bash, yash, zsh) rcet akanga. fish, csh, tcshEt esétant les principales coquilles qui ne supportent pas. Là, vous utiliseriez la envcommande.
Stéphane Chazelas

1
Donc , pour définir à la fois -9et -eXZ opte, vous voulez XZ_OPT=-e9mais comme @krzyk a souligné, -e est extrêmement lent
plaques

4
Pour mémoire: XZ_OPTn’est pas une fonctionnalité implémentée dans tar. C'est une caractéristique de xz. Lors des tarappels xz, la variable env est simplement transmise.
Sven

14
XZ_OPT=-9e tar cJf tarfile.tar.xz directory

est encore mieux que

XZ_OPT=-9 tar cJf tarfile.tar.xz directory

5
Comment est-ce meilleur? Que fait le drapeau e?
cxdf

2
option -e, --extremeModifiez le préréglage de compression (-0 ... -9) afin d'obtenir un rapport de compression légèrement supérieur sans augmenter l'utilisation de la mémoire du compresseur ou du décompresseur (exception: l'utilisation de la mémoire du compresseur peut augmenter un peu avec les préréglages -0 ... -2). L'inconvénient est que le temps de compression augmentera considérablement (il peut facilement doubler).
Evandro Jr

Donc, si je compresse environ 80 Go de logiciel sur ma machine (quand je veux que toutes les ressources de l'ordinateur aillent au processus de compression pour la vitesse), je ne devrais -9pas utiliser -9e, ouais?
Nyxee

1
Par défaut, xz utilise 1 cœur / fil, vous pouvez maximiser ce nombre en ajoutant -T0, par exempleXZ_OPT="-9e -T0" tar -cJf ...
EkriirkE

10

Si vous avez 16 Go de RAM (et rien d’autre en cours), vous pouvez essayer:

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

Cela nécessitera 1,5 Gio pour la décompression et environ 11 x pour la compression. Ajustez en conséquence pour moins de mémoire.

Cela ne vous aidera si les données sont en fait que les grandes, et en tout cas , il ne sera pas utile QUE beaucoup, mais quand même ...

Si vous compressez des fichiers binaires, ajoutez --x86 en tant que première option xz. Si vous jouez avec des fichiers "multimédia" (audio non compressé ou bitmaps), vous pouvez essayer avec --delta = dist = 2 (expérimentez avec value, les bonnes valeurs à essayer sont 1..4).

Si vous vous sentez très aventureux, vous pouvez essayer de jouer avec plus d’options LZMA, comme

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

(Ce sont les paramètres par défaut, vous pouvez essayer des valeurs comprises entre 0 et 4, et lc + lp ne doit pas dépasser 4)

Pour voir comment les préréglages par défaut correspondent à ces valeurs, vous pouvez consulter le fichier source src / liblzma / lzma / lzma_encoder_presets.c. Rien d’intérêt là-bas cependant (-e fixe la longueur à 273 et ajuste également la profondeur).


6

Vous pouvez essayer différentes options, pour moi -4e fonctionne mieux

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

J'ai testé en exécutant:

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

Il semble donc que l'option -4e fonctionne un peu mieux 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

3
Cela ne répond vraiment pas à la question. Ceci est juste une observation que pour votre petit ensemble de données particulier, -4e obtient déjà la meilleure compression et que les niveaux les plus élevés n'apportent plus d'avantages (et même une pénalité très légère).
psusi le

Êtes-vous le même utilisateur que Szymon Roziewski ? Si c'est le cas, merci de ne pas poster plusieurs réponses. Modifiez plutôt votre réponse d'origine. Si vous ne pouvez pas accéder à votre premier compte, veuillez voir ici comment fusionner vos comptes. En attendant, je supprime votre réponse précédente et l’inclus ici.
terdon

Ok, j'ai fait une étude plus complète à ce sujet. Ce que j'ai est ici. J'ai choisi certains fichiers de mon disque dur et fait une compression avec les options -4e et -9e. Il est donc préférable de trouver la meilleure solution par vous-même. Vous aviez raison, dans certains cas, -9e est préférable, tandis que dans d'autres, ce n'est pas le cas: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
Szymon Roziewski le

(les commentaires ne peuvent être édités que pendant 5 minutes)txt 109 txt/pdf 135
Szymon Roziewski le

2
+1 Cela aide l'OP à trouver un moyen de déterminer la compression maximale pour tarles fichiers ing à l'aide de xz.
cychoi

5

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/    

compresser également avec des compresseurs externes:

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

décompresser les compresseurs externes:

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

list compresseurs externes d'archives:

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

1
Cela semble une solution de travail, mais, dans l’état actuel des choses, il serait grandement amélioré si son formatage était corrigé et que l’explication de l’option était -Iajoutée.
Dhag

4

tarLa commande utilise Jflag pour les fichiers xz. Un exemple:

tar -cJvf foo.tar.xz foo/


2
Le Jétait déjà mentionné dans la réponse de bdowning
Anthon

3

Pour les personnes intéressées, sa -e9taille est 0,4% plus petite, 20% plus lente à la compression, 3% plus lente à la décompression, par rapport à -9un ordinateur portable classique. Ici, le timing s'exécute sur la structure de répertoire du code source Python.

Compression:

$ 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

Décompression:

$ 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

Taille du fichier:

$ 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

1
Nom de variable incorrect en choisissant, car T0 est l'option permettant d'activer l'archivage multithread.
Dzenly le

@Dzenly Tu as raison! Je vous remercie! Changé.
plaques

2

Ce n'est pas une réponse exacte à votre question mais vous pouvez utiliser une commande au lieu de deux:

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

ajoute tous les fichiers du répertoire "dir1" à archive archive.7z en utilisant "ultras ettings"

les autres formats supportés sont: zip, gzip, bzip2 ou tar. pour cela remplacez juste 7zaprès -t.
--la sourceman 7z

REMARQUE: n'utilisez pas cette commande pour sauvegarder vos fichiers système, à l' exception des fichiers personnels, car le format 7z ne stocke pas les autorisations du système de fichiers .


5
La question portait sur xz, pas sur 7z, bien qu'ils utilisent tous les deux la compression LZMA.
Amédée Van Gasse

2

Dans une machine multicœur à partir de la version v5.2.0 de xz-utils, vérifiez:

-T, --threads=NUM   use at most NUM threads; the default is 1; set to 0

Si vous souhaitez utiliser le nombre maximal de cœurs et la compression maximale:

export XZ_DEFAULTS="-9 -T 0 "

Ou définissez -T sur le nombre de cœurs que vous souhaitez utiliser.

Ensuite:

tar cJf target.tar.xz source

Cela peut aussi être utile pour choisir le niveau de compression:

https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO


1

Si vous souhaitez que cela se termine plus rapidement, en utilisant plusieurs threads, mais sans ralentir votre système pendant que vous effectuez un autre travail, essayez d'ajouter -Tnoù n est le nombre de threads que vous souhaitez utiliser, ainsi que nicede rétrograder la compression en priorité inactive.

Modèle (pour 4 fils):

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

Essayez de regarder dans topou htoplorsque vous faites cela dans un grand répertoire (plusieurs Go). Espérons que vous devriez voir plusieurs xzthreads avec la valeur Nice de 19 (priorité la plus basse).

J'ai également simplifié ce point, de la manière suivante: les -f -réponses suivantes ne sont tout simplement pas nécessaires, car tarla sortie par défaut est stdout.

Vous pouvez niceégalement traiter le fichier tar, mais je ne l'ai jamais trouvé nécessaire, comme xztoujours les goulots d'étranglement du processeur pour le pipeline.

Note pratique, je l'utilise rarement xz -9pour quoi que ce soit, pas à cause du temps processeur ou du temps alloué, mais à cause de la mémoire importante. Jetez un coup d'œil à https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO#Memory_requirements_on_compression . Le xzcompresseur, comme bzip2, mais contrairement gzip, utilise plus de mémoire pour des facteurs de compression plus élevés. Mis à part cela, qui xzutilise beaucoup plus de mémoire que tout autre compresseur, vous pouvez facilement utiliser plus de 600 Mo de mémoire. Et si vous utilisez l' -Toption pour activer la compression par thread, les exigences en mémoire vont encore plus loin. Par exemple, si vous exécutez un petit service sur une petite machine virtuelle dotée de 1 à 2 Go de mémoire, vous risquez par inadvertance d’avoir un impact.


1

Sur Mac OS X, une autre approche pour transmettre le paramètre tarconsiste à utiliser un --options=indicateur. Par exemple,

tar Jcvf targetFileName.tar.xz --options='compression-level=9' directoryName
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.