191 votes

Comment spécifier le niveau de compression lors de l'utilisation de tar -zcvf?

Je compresse très souvent des répertoires au travail. Ce que je fais normalement, c'est

tar -zcvf file.tar.gz /chemin/vers/le/répertoire

Y a-t-il un moyen de spécifier le niveau de compression ici? Je veux utiliser la meilleure compression possible même si cela prend plus de temps pour compresser.

185voto

GZIP=-9 tar cvzf file.tar.gz /path/to/directory

en supposant que vous utilisez bash. En général, définissez la variable d'environnement GZIP sur "-9" et exécutez tar normalement.

En outre, si vous voulez vraiment une compression optimale, n'utilisez pas gzip. Utilisez lzma ou 7z.

Et lors de l'utilisation de gzip (ce qui est de toute façon une bonne idée pour diverses raisons), envisagez d'utiliser le programme pigz et pas le gzip.

83voto

Siim K Points 577

Au lieu d'utiliser le drapeau gzip pour tar, compressez manuellement les fichiers après le processus tar, puis vous pouvez spécifier le niveau de compression pour le programme gzip :

tar -cvf files.tar /chemin/vers/fichier0 /chemin/vers/fichier1 ; gzip -9 files.tar

Ou vous pourriez utiliser :

tar cvf - /chemin/vers/fichier0 /chemin/vers/fichier1 | gzip -9 - > files.tar.gz

Le -9 dans la ligne de commande gzip indique à gzip d'utiliser le niveau de compression maximal possible (par défaut -6).

Éditer: Ligne de commande de pipe corrigée sur la base du commentaire de @depesz.

78voto

David C. Bishop Points 1432

Les versions modernes de tar prennent en charge le format d'archive xz (GNU tar, depuis la version 1.22 en 2009, Busybox depuis la version 1.17.0 en 2010).

Cela est basé sur lzma2, un peu comme une version 7-Zip du gz. Cela offre une meilleure compression si vous acceptez le besoin de support xz.

tar -Jcvf file.tar.xz /chemin/vers/dossier

J'ai découvert ici (essentiellement un doublon de cette question, mais sur Unix stackexchange) qu'il existe également une variable d'environnement XZ_OPT=-9 pour contrôler le niveau de compression XZ similaire à celui de GZIP dans l'autre post.

XZ_OPT=-9 tar -Jcvf file.tar.xz /chemin/vers/dossier

40voto

carlito Points 649
tar cv /chemin/vers/le/dossier | gzip --best > fichier.tar.gz

Ceci est la deuxième solution de Matrix Mole, mais légèrement raccourcie :

Lors de l'appel à tar, l'option f indique que la sortie est un fichier. En le définissant à - (stdout), tar écrit sa sortie sur stdout, ce qui est le comportement par défaut sans f et -.

Et comme indiqué dans la page de manuel de gzip, si aucun fichier n'est spécifié, gzip va compresser à partir de l'entrée standard. Il n'y a pas besoin de - dans l'appel à gzip.

L'option --best (équivalente à -9) définit le niveau de compression le plus élevé.

19voto

Chris Gibson Points 199

Il est également possible de spécifier le programme de compression en utilisant -I. Cela peut inclure l'option de niveau de compression.

tar -I 'gzip -9' -cvf file.tar.gz /chemin/vers/le/dossier

Notez que l'option -I est un raccourci pour --use-compress-program=COMMANDE. Cela est important si vous n'utilisez pas GNU tar mais BSD tar. Ce dernier utilise l'option -I comme raccourci pour l'option --files-from nom_fichier.

Donc pour rendre votre commande "multiplateforme", vous pourriez écrire :

tar --use-compress-program='gzip -9' -cvf file.tar.gz /chemin/vers/le/dossier

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X