web-dev-qa-db-fra.com

Comment obtenir une compression maximale avec .tar.gz?

Si je comprends bien l'utilisation de tar + gzip, tar est normalement utilisé pour consolider un groupe de fichiers dans un seul fichier, puis gzip est utilisé pour compresser ce fichier.

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

Comme je ne comprends pas tout à fait le fonctionnement de la compression, c’est (probablement ridicule) que l’envoi d’un fichier .tar pré-compressé à gzip empêche la compression de gzip aussi bien que son potentiel le permet, entre autres choses.

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?

54
Mario Zigliotto

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
103
Brian Fane

Comme vous l'avez dit- "tar can peut aussi compresser", implique que - tar ne _ pas {toujours compresser les données par lui-même.

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

Toutefois, comme indiqué dans this answer, vous pouvez diriger les deux commandes: tar & gzip de sorte que vous puissiez spécifier explicitement le niveau de compression de la commande gzip afin d'obtenir la plus petite taille de sortie.

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

Ici, 9 spécifie le niveau de compression maximal possible.

40
Ujjwal Singh

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, 7z et advdef pour obtenir le plus petit fichier. Pour utiliser ceci afin de créer la plus petite exécution de fichier possible:

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

L'utilitaire advdef de AdvanceCOMP donne généralement le plus petit fichier, mais est également bogué (l'utilitaire gz99 vérifie qu'il n'a pas corrompu le fichier avant d'accepter la sortie de advdef). Pour utiliser advdef directement, 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 ce que vous pouvez faire de mieux avec le format gz.

Comme vous n’avez appris que récemment que tar peut être compressé, et n’avez pas expliqué 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 vous 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 constatons é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.

14
gmatht
tar c /path/to/data | gzip --best > file.tar.gz

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

6
carlito