Come ottenere la massima compressione con .tar.gz? [duplicare]


63

Questa domanda ha già una risposta qui:

Il modo in cui capisco l'uso di tar + gzip è che tarviene normalmente utilizzato per consolidare un raggruppamento di file in un singolo file, quindi gzipviene utilizzato per comprimere quel file.

Di recente ho imparato che tarpuò anche comprimere.

Poiché non capisco fino in fondo come funziona la compressione @ è fondamentale, ho (forse ridicolo) i timori che l'invio di un .tar precompresso a gzip potrebbe impedire a gzip di comprimersi così come il suo potenziale consentirebbe e cose del genere.

La mia domanda è essenzialmente: quale combinazione di metodi args / compressione dovrei usare per creare il tar.gz più piccolo in assoluto, e come dovrebbe essere l'istruzione della riga di comando?


2
La compressione di file già compressi può ridurne le dimensioni o può ingrandire l'archivio. Tutto dipende dal tipo di dati e dall'eventuale compressione utilizzata.
Keltari,

Cosa ha detto @Keltari. Le percentuali e i rapporti di compressione dipendono fortemente da ciò che si sta comprimendo, motivo per cui esistono diversi algoritmi e metodi di compressione.
music2myear,

Risposte:


111

Oppure, puoi dire a tar all'utente la massima compressione in questo modo:

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

Inoltre, per mantenere il tuo ingombro privo di ingombri, puoi farlo:

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

43

Come hai detto, " tar può anche comprimere ", implica che - tarnon sempre comprime i dati da solo.

Lo fa solo se utilizzato con l' zopzione. Anche questo non da solo, ma - passando i dati tarred attraverso gzip.

Tuttavia, come indicato in questa risposta, è possibile eseguire il pipe dei due comandi: tare gziptale da poter specificare in modo esplicito il livello di compressione affinché il gzipcomando raggiunga la dimensione di output più piccola.

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

Qui 9specifica il massimo livello di compressione possibile.


Ho avuto un problema in cui non è ricorsivo, e mi lamento che sarà un archivio vuoto, poiché il comando è diviso, è difficile trovare il modo di forzare correttamente ricorsivo, poiché è già predefinito tar. MIO MALE, l'avevo erroneamente specificato iniziando cosìtar -cvf /path
Brian Thomas il

17

Di solito né gzip né tar possono creare "tar.gz più piccolo in assoluto". Esistono molte utilità di compressione che possono comprimere nel formato gz. Ho scritto uno script bash " gz99 " per cercare gzip, 7ze advdefper ottenere il file più piccolo. Per usarlo per creare la più piccola esecuzione di file possibile:

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

L' advdefutilità di AdvanceCOMP di solito fornisce il file più piccolo, ma è anche buggy (l' gz99utilità verifica che non abbia corrotto il file prima di accettare l'output di advdef). Per usarlo advdefdirettamente, crea file.tar.gz come preferisci. Quindi eseguire:

advdef -z -4 file.tar.gz

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

Dal momento che hai appreso solo di recente che tar può essere compresso e non hai detto perché volevi il file ".tar.gz" più piccolo, potresti non essere consapevole del fatto che con i file tar è possibile utilizzare formati più efficienti, come xz. In generale, il passaggio a un formato diverso può offrire un miglioramento notevolmente migliore della compressione rispetto al giocherellare con le opzioni gzip. Lo svantaggio principale di xz è che non è così comune come gzip, quindi le persone a cui invii il file potrebbero dover installare un nuovo pacchetto. Inoltre tende ad essere un po 'più lento, in particolare durante la compressione. Se questo non ti interessa, e vuoi davvero il più piccolo file tar, prova:

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

Le versioni moderne di tar, ad 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 si confrontano queste utilità di compressione, si consideri l'effetto di comprimere patch-3.1.1 dal kernel di 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 minimo gz abbiamo bisogno di advdef (anche se 7z -tgzip è quasi altrettanto buono e molto meno buggy). Vediamo anche che il passaggio a xz ci guadagna molto più spazio rispetto al tentativo di spremere il massimo dal vecchio formato gz, senza che la compressione richieda troppo tempo.


L'OP ha chiesto come ottenere la massima compressione per un file .tar.gz, ma hai suggerito di creare un file .tar.xz. Stai rispondendo a una domanda diversa da quella posta.
ChrisInEdmonton,

Ah, capisco cosa stai cercando. advdef si blocca sul mio sistema (v1.15), quindi 'advdef -z -4 file.tar.gz' non funziona, ma almeno teoricamente potrebbe. Non riesco a trovare prove che ridurrebbe il file oltre 'gzip -9', ma potrebbe, e in ogni caso è sufficiente per me rimuovere il mio voto -1. Grazie per il chiarimento!
ChrisInEdmonton,

Hmm, sto usando v1.17. Comunque, il matematico pedante in me vuole sottolineare che la mia risposta è discutibilmente tecnicamente corretta. Dopotutto, se si enumerano tutti i possibili file gz dal più breve al più lungo e si sceglie il primo che si decomprime nel file giusto, è possibile eliminare ancora qualche byte in più. Ma in pratica sarebbe troppo lento.
Gmatht

Non credo che "buggy" e "archivio" debbano mai essere usati insieme, a che serve un archivio corrotto? È necessario un file molto più grande per "confrontare" le utilità di compressione e anche diversi tipi di file di input: misurare le differenze in centesimi di secondo non è così affidabile, penso che di xz -9solito impieghi circa 5 volte il gz -9tempo, non solo 1,5 volte il tuo tavolo suggerisce.
Xen2050

come possiamo creare archivi divisi (durante la compressione) usando il processo xz per favore
nyxee

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

gzipL'opzione --best(equivalente a -9) richiede il livello di compressione più elevato.


4
In alternativa, usa --bestflag: -9 è fonte di confusione per il lettore.
om-nom-nom,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.