2012-12-01 20:47:48 +0000 2012-12-01 20:47:48 +0000
67
67

Come ottenere la massima compressione con .tar.gz?

Il modo in cui capisco l'uso di tar + gzip è che tar è normalmente usato per consolidare un gruppo di file in un unico file, poi gzip è usato per comprimere quel file.

Ho recentemente imparato che tar può anche comprimere.

Poiché non comprendo appieno come funziona la compressione al suo interno, ho la preoccupazione (forse ridicola) che l'invio di un .tar precompresso a gzip possa impedire a gzip di comprimere al meglio delle sue potenzialità e cose del genere.

La mia domanda è essenzialmente: Quale combinazione di argomenti/metodi di compressione dovrei usare per creare il più piccolo tar.gz in assoluto, e come deve essere la dichiarazione della linea di comando per questo?

Risposte (4)

118
118
118
2013-01-31 18:55:22 +0000

Oppure, potete dire a tar di usare la massima compressione in questo modo:

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

Inoltre, per mantenere le vostre envars in ordine, potete fare così:

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
44
44
44
2012-12-02 03:37:18 +0000

Come hai detto tu - “tar può anche comprimere”, implica che - tar non comprime sempre i dati da solo.

lo fa solo se usato con l'opzione z. Anche questo non da solo, ma passando i dati tarati attraverso gzip.

Comunque invece, come notato in questa risposta, si possono mettere in pipe i due comandi: tar & gzip in modo da poter specificare esplicitamente il livello di compressione per il comando gzip per ottenere la dimensione di output più piccola.

tar cvf - /path/to/directory | gzip -9 - > file.tar.gz

Qui 9 specifica il massimo livello di compressione possibile.

17
17
17
2014-03-10 15:23:08 +0000

Di solito né gzip né tar possono creare “il più piccolo tar.gz in assoluto”. Ci sono molte utility di compressione che possono comprimere nel formato gz. Ho scritto uno script bash gz99 “ per provare gzip, 7z e advdef per ottenere il file più piccolo. Per usarlo per creare il più piccolo file possibile esegui:

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

L'utilità advdef di AdvanceCOMP di solito dà il file più piccolo, ma è anche difettosa (l'utilità gz99 controlla di non aver corrotto il file prima di accettare l'output di advdef). Per usare direttamente advdef, crea file.tar.gz come preferisci. Poi esegui:

advdef -z -4 file.tar.gz

Questo creerà un file gz standard che può essere letto da gzip e tar normalmente, solo un po’ più piccolo. Questo è il meglio che si può fare con il formato gz.

Dato che hai imparato solo recentemente che tar può comprimere, e non hai detto perché volevi il più piccolo file ”.tar.gz", potresti non sapere che ci sono formati più efficienti che possono essere usati con i file tar, come xz. Generalmente, passare a un formato diverso può dare un miglioramento di gran lunga migliore nella compressione che armeggiare con le opzioni gzip. Lo svantaggio principale di xz è che non è così comune come gzip, quindi le persone a cui si invia il file potrebbero dover installare un nuovo pacchetto. Tende anche ad essere un po’ più lento, in particolare durante la compressione. Se questo non vi interessa, e volete davvero il file tar più piccolo, provate:

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

Le versioni moderne di tar, per esempio su Ubuntu 13.10, rilevano automaticamente i file compressi. Quindi anche se usi la compressione xz puoi comunque decomprimere come al solito:

tar xvf file.tar.xz

Per dare una rapida idea di come queste utility di compressione si confrontino, considera l'effetto della compressione di patch-3.1.1 del kernel 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

In questo banale esempio, vediamo che per ottenere il più piccolo gz abbiamo bisogno di advdef (sebbene 7z -tgzip sia quasi altrettanto buono e molto meno buggato). Vediamo anche che passare a xz ci fa guadagnare molto più spazio che cercare di spremere il massimo dal vecchio formato gz, senza che la compressione richieda troppo tempo.

6
6
6
2014-02-06 18:25:54 +0000
tar c /path/to/data | gzip --best > file.tar.gz

gzip l'opzione --best (equivalente a -9) chiede il livello di compressione più alto.