Poiché i file tar sono un formato di streaming - puoi cat
due 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.xz
sarà un tarball compresso di tutti i file nei tarball del componente che è solo leggermente corrotto. Per estrarre, dovrai usare l' --ignore-zeros
opzione (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 tar
supporta anche una --concatenate
modalità per la produzione di archivi combinati. Ciò ha le stesse limitazioni di cui sopra - è necessario utilizzare --ignore-zeros
per 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 tar
comprime comunque l'output.
Se gli archivi che funzionano solo con una particolare tar
implementazione non sono adeguati ai tuoi scopi, l'aggiunta all'archivio con il r
tuo 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 cat
versioni, 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.xz
contenere molti db-*.tar
file (non compressi) .