web-dev-qa-db-fra.com

Ajouter / mettre à jour un fichier dans une archive tar.gz existante?

Existe-t-il un moyen d'ajouter/mettre à jour un fichier dans une archive tar.gz? Fondamentalement, j'ai une archive qui contient un fichier à /data/data/com.myapp.backup/./files/settings.txt et j'aimerais extraire ce fichier de l'archive (déjà fait) et le repousser dans l'archive une fois l'édition terminée. Comment puis-je accomplir cela? Est-ce problématique à cause du . Sur le chemin?

78
Naftuli Kay

Le format de fichier tar n'est qu'une série de fichiers concaténés avec quelques en-têtes. Ce n'est pas un travail très compliqué de le déchirer, de mettre votre contenu et de le remonter. Cela étant dit, Jander décrit comment tar en tant que programme n'a pas les fonctions utilitaires pour le faire et il y a des complications supplémentaires avec la compression, qui doit à la fois avant et après avoir fait un changement.

Il existe cependant des outils pour le travail! Il existe au moins deux systèmes qui vous permettront de faire un montage en boucle d'une archive tar compressée sur un dossier, puis d'effectuer vos modifications dans le système de fichiers. Lorsque vous avez terminé, démontez le dossier et votre archive compressée est prête à rouler.

La première option serait le projet archivemount pour Fuse . Voici n tutoriel à ce sujet . Votre système a probablement déjà Fuse et si ce n'est pas le cas, votre distribution devrait avoir une option pour cela.

L'autre option est tarfs . C'est plus simple à utiliser , mais j'ai entendu dire qu'il avait des problèmes avec la corruption des archives bzip2, donc vous pourriez d'abord tester cela de manière assez approfondie.

18
Caleb

Pour extraire votre fichier de vos archives, vous pouvez utiliser tar xzf archive.tar.gz my/path/to/file.txt. Notez que les répertoires du chemin du fichier seront également créés. Utilisation tar t (c'est à dire. tar tzf archive.tar.gz) pour lister les fichiers dans l'archive.

tar ne prend pas en charge la mise à jour "sur place" des fichiers. Cependant, vous pouvez ajouter des fichiers à la fin d'une archive, même s'ils ont le même chemin d'accès qu'un fichier déjà dans l'archive. Dans ce cas, les deux copies du fichier seront dans l'archive et le fichier ajouté ultérieurement remplacera la précédente. La commande à utiliser pour cela est tar r (ou tar u pour ajouter uniquement des fichiers plus récents que l'archive) est la commande à utiliser. Le . dans le chemin ne devrait pas poser de problème.

Il y a cependant un hic: vous ne pouvez pas ajouter à une archive compressée. Il vous faudrait donc faire:

gunzip archive.tar.gz
tar rf archive.tar data/data/com.myapp.backup/./files/settings.txt
gzip archive.tar

Ce qui n'est probablement pas ce que vous voulez entendre, car cela signifie réécrire l'intégralité de l'archive deux fois. S'il ne s'agit pas d'une archive très volumineuse, il peut être préférable de décompresser le tout, puis de le recalculer après l'édition. Alternativement, vous pouvez utiliser une archive non compressée.

48
Jander

Tar était à l'origine destiné à être utilisé pour les bandes, donc le "remplacement" des fichiers n'est pas vraiment dans la conception. Cependant, vous pouvez utiliser --delete pour supprimer le fichier du tar d'origine, puis -u pour mettre à jour le tar et rajouter le fichier. Cela peut prendre un peu, car tar doit réorganiser l'archive en interne.

9
rleibman