Da TAR-Dateien ein Streaming-Format sind - Sie können cat
zwei davon zusammen erstellen und ein nahezu korrektes Ergebnis erzielen - müssen Sie sie dazu überhaupt nicht auf die Festplatte extrahieren. Sie können die Dateien (nur) dekomprimieren, miteinander verketten und diesen Stream erneut komprimieren:
xzcat *.tar.xz | xz -c > combined.tar.xz
combined.tar.xz
wird ein komprimierter Tarball aller Dateien in den Komponententarballs sein, der nur geringfügig beschädigt ist. Zum Extrahieren müssen Sie die --ignore-zeros
Option (in GNU tar
) verwenden, da die Archive eine Markierung für das Dateiende haben, die in der Mitte des Ergebnisses angezeigt wird. Davon abgesehen wird jedoch alles korrekt funktionieren.
GNU tar
unterstützt auch einen --concatenate
Modus zum Erstellen kombinierter Archive. Das hat die gleichen Einschränkungen wie oben - Sie müssen --ignore-zeros
zum Extrahieren verwenden - aber es funktioniert nicht mit komprimierten Archiven. Sie können etwas aufbauen, um es durch Prozesssubstitution zum Arbeiten zu bringen, aber es ist mühsam und noch fragiler.
Wenn es Dateien gibt, die mehr als einmal in verschiedenen TAR-Dateien angezeigt werden, funktioniert dies nicht richtig, aber Sie haben dieses Problem trotzdem. Andernfalls erhalten Sie das, was Sie möchten. Wenn Sie die Ausgabe durchleiten, xz
wird tar
die Ausgabe ohnehin komprimiert.
Wenn Archive, die nur mit einer bestimmten tar
Implementierung funktionieren, für Ihre Zwecke nicht geeignet sind, ist das Anhängen an das Archiv mit r
Ihr Freund:
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
Dadurch wird immer nur ein einzelnes Archiv extrahiert, sodass der Arbeitsbereich auf die Größe des Inhalts eines einzelnen Archivs beschränkt ist. Die Komprimierung wird so gestreamt, als wäre es gewesen, wenn Sie das endgültige Archiv auf einmal erstellt hätten. Es wird also so gut sein, wie es jemals hätte sein können. Sie führen eine Menge übermäßiger Dekomprimierung und Rekomprimierung durch, cat
wodurch dies langsamer als bei den Versionen wird. Das resultierende Archiv funktioniert jedoch überall ohne besondere Unterstützung.
Beachten Sie, dass - je nachdem, was genau Sie möchten - das Hinzufügen der unkomprimierten TAR-Dateien selbst zu einem Archiv möglicherweise ausreicht. Sie komprimieren (fast) genau so gut wie ihren Inhalt in einer einzelnen Datei und reduzieren den Komprimierungsaufwand für jede Datei. Das würde ungefähr so aussehen:
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
Dies ist in Bezug auf die endgültige komprimierte Größe etwas weniger effizient, da der Stream zusätzliche Tar-Header enthält, spart jedoch Zeit beim Extrahieren und erneuten Hinzufügen aller Dateien als Dateien. Sie würden am Ende combined.tar.xz
viele (unkomprimierte) db-*.tar
Dateien enthalten.