web-dev-qa-db-fra.com

Comment mettre à jour un fichier dans une archive Zip

Est-il possible de remplacer un fichier dans un fichier Zip sans décompresser l’ancien fichier en ajoutant le nouveau fichier et en le rempotant?

La raison est que j'ai un fichier Zip qui est vraiment gros, il y a un xml à l'intérieur du fichier Zip que je dois mettre à jour de temps en temps. Décompresser le zip et le décompresser prend beaucoup de temps. Je voudrais donc pouvoir simplement remplacer le XML dans le zip par un script. J'ai déjà ce chèques pour les mises à jour sur le xml que j'ai.

Alors, est-il possible de simplement remplacer le fichier XML sans décompresser ni reripper?

Désolé, je voudrais utiliser la commande Zip pour faire des choses comme ça, mais le problème est que le script est en fait pour un Android téléphone et Zip n'est pas une commande que je peux utiliser malheureusement désolé j'ai laissé cela de côté. Je ont utilisé Zip définitivement si je pouvais mais je n'ai que décompresser pour droid et puis il y a du goudron dans busybox mais le goudron ne fait pas ce dont j'ai besoin

68
user577732

De Zip (1) :

Lorsqu'il reçoit le nom d'une archive Zip existante, Zip remplacera les entrées portant le même nom dans l'archive Zip ou ajoutera des entrées pour les nouveaux noms.

Utilisez donc la commande Zip comme vous le feriez normalement pour créer un nouveau fichier .Zip ne contenant que ce fichier, à l’exception du nom de fichier .Zip que vous spécifiez, il s’agira de l’archive existante.

51
PleaseStand

J'ai trouvé le fichier Linux Zip lourd pour remplacer un seul fichier dans un fichier Zip. L’utilitaire jar du Java Kit de développement peut être plus facile. Considérez la tâche courante de mettre à jour WEB/web.xml dans un fichier JAR (qui est juste un fichier Zip):

jar -uf path/to/myapp.jar -C path/to/dir WEB-INF/web.xml

Ici, path/to/dir est le chemin d’un répertoire contenant le WEB-INF répertoire (qui contient lui-même web.xml).

63
cayhorstmann

Essayez ce qui suit:

Zip [zipfile] [file to update] 

Un exemple:

$ Zip test.Zip test/test.txt
updating: test/test.txt (stored 0%)
36
user738048

Je sais que c'est une vieille question, mais je voulais faire la même chose. Mettre à jour un fichier dans l'archive Zip. Et aucune des réponses ci-dessus ne m'a vraiment aidé.

Voici ce que j'ai fait. Répertoire temporaire créé abc. Copié file.Zip à abc et a extrait le fichier dans ce répertoire. J'ai édité le fichier que je voulais éditer. Puis, tout en étant dans abc, exécutez la commande suivante

user@Host ~/temp/abc $ Zip -u file.Zip
updating: content/js/ (stored 0%)
updating: content/js/moduleConfig.js (deflated 69%)

-u _ switch recherchera les fichiers modifiés/nouveaux et les ajoutera à l’archive Zip.

13
traditional

Utilisez le drapeau de mise à jour: -u

Exemple:

Zip -ur existing.Zip myFolder

Cette commande va compresser et ajouter myFolder (et son contenu) au existing.Zip.


tilisation avancée:

L’indicateur de mise à jour compare les fichiers entrants aux fichiers existants et ajoute de nouveaux fichiers ou met à jour ceux existants.

Par conséquent, si vous souhaitez ajouter/mettre à jour un sous-répertoire spécifique dans le fichier Zip, il suffit de mettre à jour la source comme vous le souhaitez, puis de compresser de nouveau la source avec le fichier -u drapeau. Seuls les fichiers modifiés seront compressés.

Si vous n’avez pas accès aux fichiers source, vous pouvez décompresser le fichier Zip, puis mettre à jour les fichiers souhaités, puis réextraire avec le fichier -u drapeau. Encore une fois, seuls les fichiers modifiés seront compressés.

Exemple:

structure source originale


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt

Structure source mise à jour


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt 
│   │   ├── logs4.txt <-- NEW FILE 

tilisation

$ Zip -ur existing.Zip ParentDir 
> updating: ParentDir/ChildDir/Logs (stored 0%)
>   adding: ParentDir/ChildDir/Logs/logs4.txt (stored 96%)
10
Ethan Strider

Vous pouvez utiliser: Zip -u file.zip path/file_to_update

4
Renato Luiz Ramos

Il y a aussi l'option -f qui rafraîchira le fichier Zip. Il peut être utilisé pour mettre à jour TOUS les fichiers mis à jour depuis la création du fichier Zip (en supposant qu'ils se trouvent au même endroit dans la structure arborescente du fichier Zip).

Si votre fichier s'appelle /myfiles/myzip.Zip, tout ce que vous avez à faire est

Zip -f /myfiles/myzip.Zip
1
gvrocha

7Zip (7za) peut être utilisé pour ajouter/mettre à jour joliment des fichiers/répertoires:

Exemple: Remplacement (quelle que soit la date du fichier) du fichier MANIFEST.MF Dans un fichier JAR. Le répertoire /source/META-INF Contient le fichier MANIFEST.MF À placer dans le fichier jar (Zip):

7za a /tmp/file.jar /source/META-INF/

Seulement mettre à jour (ne remplace pas la cible si la source est plus ancienne)

7za u /tmp/file.jar /source/META-INF/
0
mzsolt

Du côté de la structure d'archive Zip - vous pouvez mettre à jour le fichier Zip sans le recompresser, il vous suffira d'ignorer tous les fichiers antérieurs au fichier que vous devez remplacer, puis de placer votre fichier mis à jour, puis le reste des fichiers. Et enfin, vous aurez besoin de mettre la structure de répertoires centrale mise à jour. Cependant, je doute que les outils les plus courants vous permettent de le faire.

0
Nickolay Olshevsky