L'autre réponse est correcte: vous ne pouvez pas mettre à jour correctement une archive tar compressée sans la décompresser. La documentation GNU tar l' indique et la tentative de mise à jour échoue avec un message d'erreur explicite:
$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now
Cependant, si vous êtes intéressé par une solution de tri sale qui ne nécessite pas de décompression, je peux en fournir une, basée sur les observations suivantes:
- L'ajout de flux bzip2 à l'aide de
cat
est pris en charge et produit un flux bzip2 valide (il en va de même pour gzip);
- l'ajout de tars à l'aide de
cat
ne produit pas de fichier tar valide, c'est pourquoi l' --concatenate
option existe, mais nous pouvons demander à tar de prétendre qu'elle est valide:
Il peut vous sembler plus intuitif de vouloir ou d'essayer d'utiliser cat pour concaténer deux archives au lieu d'utiliser l' --concatenate
opération; après tout, cat est l'utilitaire de combinaison de fichiers.
Cependant, les archives tar intègrent un marqueur de fin de fichier qui doit être supprimé si les archives concaténées doivent être lues correctement comme une seule archive. --concatenate
supprime le marqueur de fin d'archive de l'archive cible avant l'ajout de chaque nouvelle archive. Si vous utilisez cat pour combiner les archives, le résultat ne sera pas une archive au format tar valide. Si vous devez récupérer des fichiers d'une archive qui a été ajoutée à l'aide de l'utilitaire cat, utilisez l' option --ignore-zeros
( -i
).
Sur la base de ces connaissances, nous pouvons par exemple:
cat {one,two}.tar.bz2 >combined.tar.bz2
Cela résulte, comme l'explique l'extrait de documentation ci-dessus, dans un fichier tar non valide, mais en utilisant --ignore-zeros
, il peut toujours être lu entièrement:
## Show contents of `one.tar.bz2'
$ tar tf one.tar.bz2
a
b
## Show contents of `two.tar.bz2'
$ tar tf two.tar.bz2
c
## Show contents of `combined.tar.bz2', bypassing the bad format
$ tar tif combined.tar.bz2
a
b
c
Notez comment ce qui précède répertorie les trois fichiers des deux archives d'origine, alors qu'omettre -i
(correctement) ne répertorie que les fichiers de la première archive d'origine:
$ tar tf combined.tar.bz2
a
b
Encore une fois, ce n'est rien de plus qu'une sale astuce, mais cela pourrait être utile si vous contrôlez à la fois les côtés écriture et lecture et pouvez vous assurer que -i
cela sera utilisé lorsque vous tenterez de lire à partir de fichiers créés de cette manière.