Modo ottimale per combinare rapidamente i file tar.gz


1

Sto cercando un modo per combinare più tar.gz file rapidamente.

Il caso d'uso è un client che fa clic su un pulsante di download e procede ad avere un tar.gz file consegnato a loro. Esiste un'opzione di configurazione per aggiungere ulteriori informazioni al download in uscita in GUI della nostra applicazione. Se questa opzione è selezionata, ho bisogno di combinare ulteriori tar.gz file sul download in uscita.

Sto lavorando con molti dati qui. L'aggiuntivo tar.gz i file sono superiori a un GB quando non compressi. Inoltre, il valore predefinito tar.gz il file che viene sempre consegnato può essere superiore a 10 GB quando non compresso e può contenere oltre 100 file al suo interno. A causa delle grandi dimensioni dei dati con cui lavoro, viene memorizzato in un formato compresso ( tar.gz ) sul disco.

Sto cercando di implementare questo meccanismo bash Script o in Giava .

Risposte:


2

TLDR : di solito puoi semplicemente concatenarli

Il formato file utilizzato da gzip è progettato in modo che la concatenazione di due o più file compressi e la decompressione del risultato forniscano gli stessi dati della concatenazione delle versioni non compresse; vedere https://stackoverflow.com/questions/8005114/fast-concatenation-of-multiple-gzip-files
https://stackoverflow.com/questions/16715484/can-multiple-gz-files-be-combined-such-that-they-extract-into-a-single-file

Un po 'allo stesso modo il tar il formato è stato originariamente progettato in modo da poter aggiungere solo voci alla fine di un archivio. Ciò è stato effettivamente richiesto perché "(t) ape (ar) chive" è stato progettato e utilizzato nastro magnetico per il backup e lo scambio, e le unità a nastro magnetico degli anni 1950-1980 (all'incirca) non potevano "riscrivere" in modo sicuro (aggiornamento) i dati esistenti vengono aggiunti solo alla fine. (Quelle unità poteva separare i file logici su un nastro usando un "nastro mark" ma i sistemi Unix non supportavano i metadati, ovvero le etichette su magtape e la gestione di un gran numero di file su nastro in base alla posizione numerica fisica era solo un PITA, quindi il tar l'approccio di aggiungere a un archivio esistente era molto preferito.)

Negli ultimi anni questo è diventato molto meno comune e GNU tar ora non lo supporta per impostazione predefinita; devi specificare -i (o forma lunga --ignore-zeros ) e poi funziona bene:

$ printf 'ONEONEONE%90d\n' {0..99999} >file1
$ printf 'TWOTWOTWO%90d\n' {0..199999} >file2
$ ll
total 29300
-rw-r--r--. 1 dthomps users 10000000 Sep  9 02:14 file1
-rw-r--r--. 1 dthomps users 20000000 Sep  9 02:15 file2
$ tar -czf tar1.tgz file1
$ tar -czf tar2.tgz file2
    # or tar -cf - file1 |gzip >tar1.tgz and similarly for 2, see below
$ cat tar2.tgz tar1.tgz >combined.tgz
$ tar -tvzif combined.tgz
-rw-r--r-- dthomps/users 20000000 2016-09-09 02:15 file2
-rw-r--r-- dthomps/users 10000000 2016-09-09 02:14 file1
  # or gunzip <combined.tgz |tar -tvif - see below
$

I vecchi tars possono supportare la concatenazione degli archivi per impostazione predefinita (n -i ); se avrò il tempo di avviare alcuni dei miei vecchi sistemi di test, aggiornerò. Tuttavia, di solito non supportano l'integrazione -z compressione come gtar, quindi è necessario utilizzare il tar cf - | gzip > e gunzip < | tar -xf - le forme.

Se si utilizzano percorsi relativi per i file nell'archivio, come è comune e preferito oggi, quando si estrae dal risultato concatenato tutte le voci (o tutte quelle selezionate) vengono estratte in relazione alla stessa nuova directory, quindi assicuratevi di creare ciascuna archivio 'pezzo' con percorsi relativi che funzionano insieme come desiderato. Se vuoi inserire un file in un pezzo aggiunto per sostituirne uno nel pezzo principale, usa lo stesso percorso / nome relativo; se si desidera creare file distinti, utilizzare percorsi / nomi relativi distinti.

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.