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


Je gipez des répertoires très souvent au travail. Ce que je fais normalement est

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

Est-il possible de spécifier le niveau de compression ici? Je veux utiliser la meilleure compression possible même si cela prend plus de temps à compresser.


121
2017-07-01 18:00


origine




Réponses:


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

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

De plus, si vous voulez vraiment une 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), pensez à utiliser pigz programme et non le gzip.


116
2017-07-01 18:38



pigz est plus rapide. C'est tout. Je ne vois pas de grand intérêt à ce que la compression prenne plus de temps, alors que le résultat final est pratiquement le même.
Est -9 à dessein ou une faute de frappe? - Jürgen Paul
Exprès. C'est précisément la réponse à la question OP.
pigz est "parallel gzip" qui utilise tous vos cœurs pour la compression gzip. Tu peux regarder top et le voir utiliser entre 200% -400 $ CPU. - Felipe Alvarez
La variable d'environnement semble maintenant être GZIP_OPT, l'utilisation devrait être la même. - Seer


Au lieu d'utiliser l'indicateur gzip pour tar, gzip manuellement les fichiers après le processus tar, vous pouvez 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 pourriez 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 maximum possible (la valeur par défaut est -6).

Modifier: Correction d'une ligne de commande basée sur le commentaire de @depesz.


62
2017-07-01 18:25



Utiliser des tuyaux doit être fait avec: tar cvf - /path/to/directory | gzip -9 - > file.tar.gz
1er exemple devrait se terminer par file.tar, depuis gzip ajoute l'extension ".gz". - bonsaiviking
pourquoi ne pas sauter f -? s'il n'y a pas de fichier, alors c'est stdin / out - akostadinov
ajout au commentaire previos. De la section "man tar" Environtment: TAPE Périphérique 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
et nous pouvons réduire "gzip -9 -" -> "gzip -9". De la section "man gzip" Description: Si aucun fichier n'est spécifié, ou si un nom de fichier est "-", l'entrée standard est compressée dans la sortie standard. - Mikl


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

C'est basé sur lzma2, un peu comme un 7-zip version de gz. Cela permet une meilleure compression si vous avez besoin de la prise en charge 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 Unix stackexchange) qu'il y a aussi une variable d'environnement XZ_OPT = -9 pour contrôler le niveau de compression XZ similaire à celui de GZIP dans l'autre poste.

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory

43
2017-12-19 03:03



+1 xz est bien meilleur que bzip2 et gzip. Voici une comparaison: tukaani.org/lzma/benchmarks.html - User1
Le compromis est la vitesse. XZ est significativement Ralentissez. - Bell


tar cv /path/to/directory | gzip --best > file.tar.gz

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

En appelant tar, option f indique que la sortie est un fichier. La mettre à - (stdout) fait que tar écrit sa sortie sur stdout, qui est le comportement par défaut sans les deux f et -.

Et comme indiqué par le gzip page 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 le gzip appel.

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


25
2018-02-04 18:17



Cela fonctionne à merveille. De plus, si vous exécutez en tant que root, les autorisations et les propriétaires sont également préservés. Sinon, vous devez spécifier. Aussi, si ce n'était pas évident "-9" est la meilleure compression et "-1" est la compression la plus rapide. "-1" prend encore un long moment si vous avez beaucoup de fichiers ;-) - PJ Brunet
Cela fonctionne avec xz et pixz aussi. 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. Ainsi tar -cv /path/to/dir | pixz -p4 > output.tpxz - Joel Ostblom


Il y a aussi la possibilité 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 /path/to/directory

9
2018-06-21 04:21



Les anciennes versions de tar telles que celles fournies dans CentOS 6 et 7 ne prennent pas en charge la fourniture d’arguments dans le -I arg, ils vont essayer de traiter le tout comme un nom de programme à exécuter et ainsi échouer. Au moins à partir de tar 1.29 dans Debian Stretch, cela fonctionne. - Cheetah