Come dovrei combinare molti file compressi in un archivio?


10

Ho alcune centinaia di .tar.xzfile che sono quasi identici (sono dump di database giornalieri e il database cambia lentamente).

Credo che a causa delle somiglianze nei file non compressi, si comprimeranno molto bene e i test su piccola scala hanno dimostrato che la compressione di qualsiasi numero di questi file non compressi crea un archivio solo leggermente più grande di uno di essi.

Il mio problema è che tutti i file non compressi sarebbero pochi terabyte (il rapporto di compressione è di circa 25: 1) e non ho molto spazio su disco da utilizzare come area di lavoro.

Esiste un modo per elaborare i singoli file compressi uno alla volta, aggiungendoli a un singolo archivio e conservando i vantaggi di comprimerli insieme?


Hai provato a copiarlo, in modo da decomprimere un file, aggiungere tutti i file a un determinato archivio e passare al successivo?
darnir,

Risposte:


10

Poiché i file tar sono un formato di streaming - puoi catdue di loro insieme e ottenere un risultato quasi corretto - non è necessario estrarli affatto su disco per farlo. Puoi decomprimere (solo) i file, concatenarli insieme e ricomprimere quel flusso:

xzcat *.tar.xz | xz -c > combined.tar.xz

combined.tar.xzsarà un tarball compresso di tutti i file nei tarball del componente che è solo leggermente corrotto. Per estrarre, dovrai usare l' --ignore-zerosopzione (in GNU tar), perché gli archivi hanno un marcatore "end-of-file" che apparirà nel mezzo del risultato. A parte questo, però, tutto funzionerà correttamente.

GNU tarsupporta anche una --concatenatemodalità per la produzione di archivi combinati. Ciò ha le stesse limitazioni di cui sopra - è necessario utilizzare --ignore-zerosper estrarre - ma non funziona con archivi compressi. Puoi creare qualcosa per indurlo a lavorare usando la sostituzione del processo, ma è una seccatura e ancora più fragile.

Se ci sono file che appaiono più di una volta in diversi file tar, questo non funzionerà correttamente, ma hai comunque quel problema. Altrimenti, questo ti darà quello che vuoi: convogliare l'output xzè come tarcomprime comunque l'output.


Se gli archivi che funzionano solo con una particolare tarimplementazione non sono adeguati ai tuoi scopi, l'aggiunta all'archivio con il rtuo amico è:

tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
    mkdir tmp
    pushd tmp
    tar xJf "../$x"
    tar rJf ../combined.tar.xz .
    popd
    rm -r tmp
done

Questo estrae solo un singolo archivio alla volta, quindi lo spazio di lavoro è limitato alla dimensione del contenuto di un singolo archivio. La compressione è in streaming proprio come sarebbe stato se avessi creato l'archivio finale tutto in una volta, quindi sarà buono come mai avrebbe potuto essere. Fai molta decompressione e ricompressione in eccesso che renderà questo più lento rispetto alle catversioni, ma l'archivio risultante funzionerà ovunque senza alcun supporto speciale.

Si noti che - a seconda di cosa si desidera esattamente - potrebbe essere sufficiente aggiungere gli stessi file tar non compressi a un archivio. Comprimeranno (quasi) esattamente così come i loro contenuti in un singolo file e ridurranno il sovraccarico di compressione per ogni file. Questo sarebbe simile a:

tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
    xz -dk "$x"
    tar rJf combined.tar.xz "${x%.xz}"
    rm -f "${x%.xz}"
done

Questo è leggermente meno efficiente in termini di dimensioni compresse finali perché ci sono intestazioni extra di tar nello stream, ma fa risparmiare un po 'di tempo sull'estrazione e l'aggiunta di tutti i file come file. Si finirebbe per combined.tar.xzcontenere molti db-*.tarfile (non compressi) .


Grazie, la tua seconda opzione sembra giusta per il mio scopo, ma potresti approfondire il tuo ultimo paragrafo? Come sarebbe?
jl6

@ jl6: vedi modifica.
Michael Homer,

Siamo spiacenti, ho appena potuto provare questo. Il tuo secondo metodo mi dà questo errore:tar: Cannot update compressed archives
jl6
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.