J'ai quelques centaines de .tar.xz
fichiers qui sont presque identiques (ce sont des vidages de base de données quotidiens et la base de données change lentement).
Je pense qu'en raison des similitudes des fichiers non compressés, ils se compresseront très bien et des tests à petite échelle ont montré que la compression d'un nombre quelconque de ces fichiers non compressés crée une archive à peine plus grande que l'un d'eux.
Mon problème est que tous les fichiers non compressés feraient quelques téraoctets (le taux de compression est d'environ 25: 1), et je n'ai pas beaucoup d'espace disque à utiliser comme zone de travail.
Existe-t-il un moyen de traiter les fichiers compressés individuellement un par un, en les ajoutant à une seule archive et en conservant les avantages de les compresser ensemble?
la source
Réponses:
É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: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 GNUtar
), 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 commenttar
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 avecr
est votre ami: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:
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 nombreuxdb-*.tar
fichiers (non compressés) .la source
tar: Cannot update compressed archives