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

143

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.

Lazer
la source

Réponses:

143
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 un pigzprogramme et non le gzip.


la source
14
pigz est "gzip parallèle" qui utilise tous vos cœurs pour la compression gzip. Vous pouvez regarder topet voir en utilisant n'importe où entre 200% -400 $ CPU.
Felipe Alvarez
2
FYI, pour le format .bz2, utilisez: BZIP2 = -9 tar cvjf fichier.tar.bz2 / chemin / vers / répertoire
Tomofumi
3
La variable d'environnement semble être maintenant GZIP_OPT, l'utilisation devrait être la même.
Voyant
3
Dans la page de manuel relative à gzip sous Ubuntu 16.04: "Sous Vax / VMS, le nom de la variable d'environnement est GZIP_OPT, afin d'éviter un conflit avec le jeu de symboles utilisé pour invoquer le programme." Pour sh, csh et MSDOS, cela devrait toujours être GZIP
Ponyboy47
68

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).

Edit: Correction de la ligne de commande du pipe basée sur le commentaire @depesz.

Matrix Mole
la source
4
L'utilisation de tuyaux doit être effectuée avec:tar cvf - /path/to/directory | gzip -9 - > file.tar.gz
1
Le 1er exemple devrait se terminer par file.tar, puisque gzipajoute l'extension ".gz".
bonsaïiviking
4
pourquoi ne sautez-vous pas f -? s'il n'y a pas de fichier, alors c'est stdin / out
akostadinov
ajout au commentaire previos. De la section "man tar" Environnement: TAPE Dispositif ou fichier à utiliser pour l'archive si --file n'est pas spécifié. Si cette variable d'environnement n'est pas définie, utilisez plutôt stdin ou stdout.
Mikl
2
et nous pouvons réduire "gzip -9 -" -> "gzip -9". De la section "man gzip" Description: Si aucun fichier n'est spécifié ou si le nom de fichier est "-", l'entrée standard est compressée dans la sortie standard.
Mikl
53

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 7-Zip de gz . Cela donne une meilleure compression si vous êtes d'accord avec l'exigence de besoin du support 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 également 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
David C. Bishop
la source
2
+1 xz est bien meilleur que bzip2 et gzip. Voici une comparaison: tukaani.org/lzma/benchmarks.html
User1
8
Le compromis est la vitesse. XZ est nettement plus lent.
Bell
32
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 findique que la sortie est un fichier. Si vous le -définissez sur (stdout), tar écrit sa sortie sur stdout, qui est le comportement par défaut sans les deux fet -.

Et comme indiqué dans la gzippage de manuel, si aucun fichier n'est spécifié, gzip sera compressé à partir de l'entrée standard. Il n'y a pas besoin de -dans l' gzipappel.

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

carlito
la source
1
Cela fonctionne à merveille. De plus, si vous vous exécutez en tant que root, les autorisations et les propriétaires sont également conservés. Sinon, vous devez spécifier. De plus, si ce n'était pas évident, "-9" est la meilleure compression et "-1" est la compression la plus rapide. "-1" prend encore très longtemps si vous avez beaucoup de fichiers ;-)
PJ Brunet
Cela fonctionne avec xzet pixzaussi. C'est un excellent moyen de contrôler le nombre de threads utilisés pour la compression parallèle sans avoir à créer un fichier .tar intermédiaire. Comme sitar -cv /path/to/dir | pixz -p4 > output.tpxz
joelostblom
10

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
Chris Gibson
la source
2
Les anciennes versions de tar, telles que celles fournies dans CentOS 6 et 7, ne permettent pas de fournir des arguments dans l' -Iargument. Elles essaieront de traiter l'ensemble du projet comme un nom de programme à exécuter, et échoueront donc. Au moins à partir de la version 1.29 de Debian Stretch, cela fonctionne.
Cheetah
2

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
rfay
la source