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
linux
shell-script
shell
command-line
tar
BottleZero
la source
la source
Réponses:
Bien qu'il
tar
puisse ajouter des fichiers à une archive déjà existante, il ne peut pas être compressé. Vous aurez àbunzip2
l'archive compressée, laissant une archive tar standard. Vous pouvez ensuite utilisertar
la capacité de pour ajouter des fichiers à une archive existante, puis recompresser avecbzip2
.Du manuel:
la source
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:
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:
cat
est pris en charge et produit un flux bzip2 valide (il en va de même pour gzip);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:Sur la base de ces connaissances, nous pouvons par exemple:
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: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: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.la source
i
à la ligne de commande verront le tout.