Comment obtenir une compression maximale avec .tar.gz? [dupliquer]

63

Cette question a déjà une réponse ici:

La façon dont je comprends l'utilisation de tar + gzip est qu'il tarest normalement utilisé pour consolider un groupe de fichiers dans un seul fichier, puis gzipest utilisé pour compresser ce fichier.

J'ai récemment appris que l' taron peut aussi compresser.

Comme je ne comprends pas tout à fait le fonctionnement de la compression, c’est peut-être ridicule que l’envoi d’un fichier .tar pré-compressé à gzip empêche celle-ci de se compresser aussi bien que son potentiel le permet.

Ma question est essentiellement la suivante: quelle combinaison d'arguments / méthodes de compression dois-je utiliser pour créer le plus petit fichier tar.gz absolu, et à quoi ressemble l'instruction en ligne de commande?

Mario Zigliotto
la source
2
La compression de fichiers déjà compressés peut réduire leur taille ou rendre l’archive plus volumineuse. Tout dépend du type de données et de toute compression utilisée.
Keltari
Ce que @ Keltari a dit Les taux et les taux de compression dépendent fortement de ce que vous compressez, ce qui explique également la diversité des algorithmes et des méthodes de compression.
music2myear

Réponses:

111

Vous pouvez également indiquer à tar la compression maximale de l'utilisateur de la manière suivante:

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

De plus, pour que vos envvars ne soient pas encombrés, vous pouvez procéder comme suit:

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
Brian Fane
la source
43

Comme vous l'avez dit - " tar peut aussi compresser ", cela signifie que - tarne compresse pas toujours les données toutes seules.

Il ne le fait que lorsqu'il est utilisé avec l' zoption. Cela aussi, pas par lui-même, mais en transmettant les données tarées à travers gzip.

Toutefois, comme indiqué dans cette réponse, vous pouvez diriger les deux commandes: tar& de gziptelle sorte que vous puissiez spécifier explicitement le niveau de compression de la gzipcommande afin d’atteindre une taille de sortie minimale.

tar cvf - / chemin / vers / répertoire | gzip -9 -> fichier.tar.gz

Ici 9spécifie le niveau de compression maximum possible.

Ujjwal Singh
la source
J'ai eu un problème où ce n'est pas récursif, et se plaint que ce sera une archive vide, puisque la commande est divisée, il est difficile de trouver comment forcer correctement récursif, étant donné qu'il est déjà tar par défaut. MY BAD, je l'avais incorrectement spécifié en commençant comme çatar -cvf /path
Brian Thomas
17

En général, ni gzip ni tar ne peuvent créer "le plus petit fichier tar.gz". Il existe de nombreux utilitaires de compression pouvant compresser au format gz. J'ai écrit un script bash « gz99 » pour essayer gzip, 7zet advdefpour obtenir le fichier le plus petit. Pour utiliser ceci afin de créer la plus petite exécution de fichier possible:

tar c path/to/data | gz99 file.gz

L' advdefutilitaire de AdvanceCOMP donne généralement le plus petit fichier, mais est également bogué (l' gz99utilitaire vérifie qu'il n'a pas corrompu le fichier avant d'accepter la sortie de advdef). Pour l'utiliser advdefdirectement, créez file.tar.gz comme bon vous semble. Puis lancez:

advdef -z -4 file.tar.gz

Cela créera un fichier gz standard qui peut être lu par gzip et tar normalement, mais un peu plus petit. C’est à peu près tout ce que vous pouvez faire avec le format gz.

Comme vous n’avez appris que récemment que tar peut compresser, sans indiquer pourquoi vous vouliez le plus petit fichier ".tar.gz", vous ignorez peut-être qu’il existe des formats plus efficaces pouvant être utilisés avec des fichiers tar, tels que xz. En règle générale, le passage à un format différent peut entraîner une bien meilleure amélioration de la compression que de jouer à tour de rôle avec les options gzip. Le principal inconvénient de xz est qu’il n’est pas aussi courant que gzip, il est donc possible que les personnes à qui vous envoyez le fichier doivent installer un nouveau paquet. Il a également tendance à être un peu plus lent, en particulier lors de la compression. Si cela ne vous concerne pas et que vous voulez vraiment le plus petit fichier tar, essayez:

 tar cv path/to/data | xz -9 > file.tar.xz

Les versions modernes de tar, par exemple sous Ubuntu 13.10, détectent automatiquement les fichiers compressés. Donc, même si vous utilisez la compression xz, vous pouvez toujours décompresser comme d'habitude:

 tar xvf file.tar.xz

Pour donner une idée rapide de la comparaison de ces utilitaires de compression, considérons l'effet de la compression du patch 3.1.1 à partir du noyau Linux:

utility         cpu    format  size(bytes)
gzip -9         0.02s  gz      105,628
advdef -2       0.07s  gz      102,619
7z -mx=9 -tgzip 0.42s  gz      102,297
advdef -3       0.55s  gz      102,290
advdef -4       0.75s  gz      101,956
xz -9           0.03s  xz       91,064
xz -3e          0.15s  xz       90,996

Dans cet exemple trivial, nous voyons que pour obtenir le plus petit gz, il faut advdef (bien que 7z -tgzip soit presque aussi bon et beaucoup moins bogué). Nous voyons également que le passage à xz nous fait gagner beaucoup plus d’espace que d’essayer de tirer le meilleur parti de l’ancien format gz, sans que la compression prenne trop de temps.

Gmatht
la source
L'OP a demandé comment obtenir le plus de compression possible pour un fichier .tar.gz, mais vous avez suggéré de créer un fichier .tar.xz. Vous répondez à une question différente de celle posée.
ChrisInEdmonton
Ah, je vois ce que vous allez faire. advdef se bloque juste sur mon système (v1.15), donc 'advdef -z -4 fichier.tar.gz' ne fonctionne pas, mais au moins théoriquement, il pourrait. Je ne peux trouver aucune preuve que cela réduirait davantage le fichier que «gzip -9», mais cela est peut-être possible et, dans tous les cas, cela me suffit pour retirer mon vote -1. Merci de clarifier!
ChrisInEdmonton
Hmm, j'utilise v1.17. Quoi qu'il en soit, le mathématicien pédant en moi tient à souligner que ma réponse n’est sans doute pas techniquement correcte. Après tout, si vous énumérez tous les fichiers gz possibles du plus court au plus long et que vous choisissez le premier qui se décompresse dans le bon fichier, vous pourriez encore gagner quelques octets de plus. Mais ce serait beaucoup trop lent dans la pratique.
Marmatht
Je ne pense pas que "buggy" et "archive" devraient être utilisés ensemble, à quoi sert une archive qui est corrompue? Vous avez besoin d' un beaucoup plus grand fichier à « comparer » les utilitaires de compression, et différents types de fichiers d'entrée trop - mesure en centièmes de seconde différences est pas fiable, je pense xz -9prend quelque chose comme 5 fois le gz -9temps, pas seulement 1.5x comme Votre table suggère.
Xen2050
comment pouvons-nous créer des archives divisées (lors de la compression) à l'aide du processus xz?
nyxee
6
tar c /path/to/data | gzip --best > file.tar.gz

gzipL'option --best(équivalente à -9) demande le niveau de compression le plus élevé.

carlito
la source
4
Vous pouvez également utiliser --bestflag: -9 est source de confusion pour le lecteur.
om-nom-nom