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

73

Est-il possible d'ajouter / mettre à jour un fichier dans une archive tar.gz? En gros, j'ai une archive qui contient un fichier sur /data/data/com.myapp.backup/./files/settings.txtet j'aimerais extraire ce fichier de l'archive (déjà terminé) et le replacer dans l'archive une fois la modification terminée. Comment puis-je accomplir cela? Est-ce problématique à cause du .dans le chemin?

Naftuli Kay
la source
2
+1 Cela rendrait le travail sur OS X si facile. Actuellement, je dois nettoyer à la main un répertoire de tous les fichiers cachés .DS_Store, puis le redistribuer.

Réponses:

15

Le format de fichier tar est juste 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 reconstituer. Cela étant dit, Jander a expliqué que tar, en tant que programme, ne dispose pas des fonctions d’utilité permettant de le faire et que la compression pose des problèmes supplémentaires, qui doivent être effectués avant et après toute modification.

Il existe cependant des outils pour le travail! Il existe au moins deux systèmes vous permettant d'effectuer 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 un tutoriel à ce sujet . Votre système est probablement déjà doté de FUSE et si ce n’est pas le cas, votre distribution devrait avoir une option.

L'autre option est tarfs . C’est plus simple à utiliser , mais j’ai entendu dire qu’il avait quelques problèmes avec la corruption des archives bzip2, vous pouvez donc le tester assez soigneusement au préalable.

Caleb
la source
1
J'utilise AVFS , qui est emballé dans Ubuntu et Debian. Savez-vous comment archivemount et tarfs se comparent à AVFS?
Gilles, arrête de faire le mal
Honnêtement, non, bien que je sois curieux de regarder AVFS maintenant que vous mentionnez l’alternative. J'ai utilisé à la fois archivemount et tarfs, mais c'était un projet abandonné depuis longtemps et je ne connais pas leur état actuel. J'ai en quelque sorte décidé d'après cette expérience que l'idée était fausse sur le plan conceptuel, même si la mise en œuvre fonctionnait parfaitement.
Caleb
J'ai jeté un coup d'œil à l'archivemount. Il ne modifie pas le fichier .tar.gz existant, mais lorsque vous démontez, il renomme l'original et crée un nouveau fichier tar à la place. Si vous recherchez une bonne expérience utilisateur, c'est génial, mais si vous souhaitez éviter de réécrire l'intégralité de l'archive pour des raisons d'efficacité, cela ne vous aidera pas.
Jander
@ Jander C'est pour le signaler. Je suis à peu près sûr que cela s'applique à toutes les options de montage d'archives compressées. Le problème est que les différentes parties du fichier ne sont pas compressées, les en-têtes internes globaux du fichier et tout est compressé. Pour que tout puisse être extrait, il faut que gzip soit exécuté sur l’ ensemble du jeu de données. Il n’est pas possible d’injecter quelque chose au milieu de ceci sans l’extraire, en réexécutant la compression et en réécrivant l’ensemble du fichier de données. D'où mon commentaire précédent selon lequel c'était la mauvaise solution sur le plan conceptuel . Les archives sont des archives.
Caleb
43

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 dans le chemin du fichier seront également créés. Utilisez tar t(ie tar tzf archive.tar.gz) pour lister les fichiers de l’archive.

tarne 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à présent 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 upour ajouter des fichiers plus récents que l'archive) est la commande à utiliser. Le .dans le chemin ne devrait pas être un problème.

Il y a cependant un inconvénient: vous ne pouvez pas ajouter d'archive compressée. Alors vous devriez 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 deux fois l'archive complète. Si ce n'est pas une très grande archive, il peut être préférable de tout décompresser, puis de la ré-tarer après l'édition. Alternativement, vous pouvez utiliser une archive non compressée.

Jander
la source
Cette réponse n’est correcte que dans la mesure où elle traite du tarprogramme standard . Tar en tant que format de fichier est en fait très accessible. Vous pouvez facilement écrire un script pour mettre à jour le contenu vous-même, mais d' autres outils le font déjà .
Caleb
23
Vous pouvez aussi faire cela à la manière d'Unix:gzip -dc archive.tar.gz | tar -r data/data/com.myapp.backup/./files/settings.txt | gzip >archive_new.tar.gz
Simon Richter
2
IIRC, vous pouvez simplement concaténer deux fichiers gzip. Le résultat est un fichier gzip plus volumineux contenant les deux fichiers non compressés concaténés.
FUZxxl
Une fois le fichier décompressé, n’est-il pas possible d’utiliser le drapeau --update?
pietro
@FUZxxl +1 pour avoir mentionné la concaténation gzip
Johan Boulé le
9

Le tar étant à l'origine destiné à être utilisé pour les bandes, le "remplacement" de fichiers ne fait pas vraiment partie de la conception. Cependant, vous pouvez utiliser --delete pour supprimer le fichier de l'archive d'origine, puis -u pour mettre à jour l'archive et rajouter le fichier. Cela peut prendre un peu, car tar doit réorganiser l'archive en interne.

rleibman
la source
Bienvenue sur StackExchange! Votre réponse ne contient qu'une suggestion déjà faite dans une autre réponse . Veuillez lire les autres réponses à une question avant de répondre, pour éviter de créer des doublons.
JigglyNaga
1
J'ai modifié ma réponse un peu. Je ne pense pas que l'autre réponse mentionne --delete
rleibman le
-5

sur mon Linux x86_64 GNU / Linux pour effectuer cette opération, j'utilise simplement la commande suivante:

tar cvfpz /path/archive.tar -T list.txt

Cette commande provoque la création d’une archive compressée sous l’ /pathutilisation d’une liste de fichiers inclus dans le list.txtfichier.

utilisateur64312
la source
6
Cela écrase un fichier existant /path/archive.tarau lieu d’ajouter / mettre à jour ce fichier.
Anthon