Ajout de fichiers aux fichiers tbz

8

Je cherche un moyen de mettre à jour des milliers de fichiers d'archive .tbz, donc je vais le faire avec un script shell. J'ai besoin d'ajouter un fichier à chacun.

Ma question est, existe-t-il un moyen plus rapide de le faire sans extraire le contenu de chaque tbz, puis recompresser avec le nouveau fichier inclus dans le tar contenu? À quoi ressembleraient les commandes?

Merci

BottleZero
la source
Une alternative évidente consiste à placer les fichiers compressés dans une archive tar non compressée. Mais cela change le format des données, ce qui peut ne pas être viable pour vous, et cela peut être inefficace pour un grand nombre de petits fichiers avec une redondance entre eux.
Rétablir Monica le

Réponses:

12

Bien qu'il tarpuisse ajouter des fichiers à une archive déjà existante, il ne peut pas être compressé. Vous aurez à bunzip2l'archive compressée, laissant une archive tar standard. Vous pouvez ensuite utiliser tarla capacité de pour ajouter des fichiers à une archive existante, puis recompresser avec bzip2.

Du manuel:

 -r      Like -c, but new entries are appended to the archive.  Note that this only
         works on uncompressed archives stored in regular files.  The -f option is
         required.
DopeGhoti
la source
c'est en effet vrai
Kiwy
C'est une méthode, mais ce n'est pas la seule. Il est possible de modifier un flux bzip2 sans le décompresser complètement. Je ne sais pas s'il est possible de le faire d'une manière qui permet de l'ajouter proprement à une archive tar, mais dhag montre une méthode partielle.
Gilles 'SO- arrête d'être méchant'
10

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 catest pris en charge et produit un flux bzip2 valide (il en va de même pour gzip);
  • l'ajout de tars à l'aide de catne produit pas de fichier tar valide, c'est pourquoi l' --concatenateoption 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' --concatenateopé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. --concatenatesupprime 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 -icela sera utilisé lorsque vous tenterez de lire à partir de fichiers créés de cette manière.

dhag
la source
Ce merci très intéressant pour la réponse détaillée. Malheureusement, je ne contrôle pas le processus qui finira par lire ces archives.
BottleZero
Cela peut être utilisé pour "cacher" certains fichiers dans une archive afin que quelqu'un qui extrait nonchalamment obtienne uniquement le contenu de l'archive tar d'origine, mais ceux qui savent ajouter le ià la ligne de commande verront le tout.
Monty Harder