web-dev-qa-db-fra.com

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

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

tar -zcvf file.tar.gz /path/to/directory

Y at-il un moyen de spécifier le niveau de compression ici? Je souhaite utiliser la meilleure compression possible même si sa compression prend plus de temps.

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

en supposant que vous utilisez bash. Généralement, définissez la variable d’environnement GZIP sur "-9" et exécutez tar normalement.

Aussi, si vous voulez vraiment la meilleure compression, n'utilisez pas gzip. Utilisez lzma ou 7z.

Et lorsque vous utilisez gzip (ce qui est une bonne idée pour diverses raisons), envisagez d'utiliser le programme pigz et non le gzip.

130
user7385

Au lieu d'utiliser l'indicateur gzip pour tar, gzip les fichiers manuellement après le processus tar, vous pouvez alors spécifier le niveau de compression du programme gzip:

tar -cvf files.tar /path/to/file0 /path/to/file1 ; gzip -9 files.tar

Ou vous pouvez utiliser:

tar cvf - /path/to/file0 /path/to/file1 | gzip -9 - > files.tar.gz

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

Édition: Ligne de commande de canal fixe basée sur le commentaire @depesz.

63
Matrix Mole

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

Il est basé sur lzma2 , un peu comme une version de 7-Zip de gz . Cela donne une meilleure compression si vous êtes d'accord avec l'exigence de besoin du support de xz.

tar -Jcvf file.tar.xz /path/to/directory

Je viens de découvrir ici (essentiellement une dupe de cette question, mais dans le stackexchange Unix) qu'il existe aussi une variable d'environnement XZ_OPT = -9 pour contrôler le niveau de compression XZ similaire à celui de GZIP dans l'autre message.

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory
47
David C. Bishop
tar cv /path/to/directory | gzip --best > file.tar.gz

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

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

Et comme indiqué dans la page de manuel gzip, si aucun fichier n'est spécifié, gzip sera compressé à partir de l'entrée standard. - n'est pas nécessaire dans l'appel gzip.

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

29
carlito

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

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory
10
Chris Gibson

Et bien sûr, le goudron dérivé de macOS bsd doit être différent:

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
2
rfay