Étant donné que les fichiers tar sont un format de streaming - vous pouvez les cat
deux ensemble et obtenir un résultat presque correct - vous n'avez pas du tout besoin de les extraire sur le disque pour ce faire. Vous pouvez décompresser (uniquement) les fichiers, les concaténer ensemble et recompresser ce flux:
xzcat *.tar.xz | xz -c > combined.tar.xz
combined.tar.xz
sera un tarball compressé de tous les fichiers dans les tarballs des composants qui n'est que légèrement corrompu. Pour extraire, vous devrez utiliser l' --ignore-zeros
option (dans GNU tar
), car les archives ont un marqueur "fin de fichier" qui apparaîtra au milieu du résultat. En dehors de cela, cependant, tout fonctionnera correctement.
GNU tar
prend également en charge un --concatenate
mode de production d'archives combinées. Cela a les mêmes limitations que ci-dessus - vous devez utiliser --ignore-zeros
pour extraire - mais cela ne fonctionne pas avec les archives compressées. Vous pouvez construire quelque chose pour le faire fonctionner en utilisant la substitution de processus, mais c'est un problème et encore plus fragile.
S'il y a des fichiers qui apparaissent plus d'une fois dans différents fichiers tar, cela ne fonctionnera pas correctement, mais vous avez malgré tout ce problème. Sinon, cela vous donnera ce que vous voulez - canaliser la sortie xz
est de toute façon comment tar
comprime sa sortie.
Si les archives qui ne fonctionnent qu'avec une tar
implémentation particulière ne conviennent pas à vos besoins, l'ajout à l'archive avec r
est votre ami:
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
Cela extrait seulement une seule archive à la fois, donc l'espace de travail est limité à la taille du contenu d'une seule archive. La compression est diffusée comme elle l'aurait été si vous aviez créé l'archive finale en même temps, elle sera donc aussi bonne qu'elle aurait pu l'être. Vous faites beaucoup de décompression et de recompression excessives qui rendront cela plus lent que les cat
versions, mais l'archive résultante fonctionnera n'importe où sans aucun support spécial.
Notez que - selon ce que vous voulez exactement - l'ajout des fichiers tar non compressés eux-mêmes à une archive peut suffire. Ils compresseront (presque) exactement ainsi que leur contenu dans un seul fichier, et cela réduira la surcharge de compression pour chaque fichier. Cela ressemblerait à quelque chose comme:
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
Ceci est légèrement moins efficace en termes de taille compressée finale car il y a des en-têtes tar supplémentaires dans le flux, mais permet d'économiser du temps sur l'extraction et l'ajout de tous les fichiers en tant que fichiers. Vous finiriez par combined.tar.xz
contenir de nombreux db-*.tar
fichiers (non compressés) .