119 votes

Comment mettre à jour un fichier dans une archive zip

Est-il possible de remplacer un fichier dans un fichier zip sans le décompresser ?

Le fichier à mettre à jour est un fichier XML qui se trouve dans une énorme archive zip. Pour mettre à jour ce fichier XML, je dois décompresser l'archive, supprimer l'ancien fichier XML, ajouter le nouveau, puis recompresser l'archive. Cela prend un temps considérable. Je voudrais donc pouvoir remplacer ce fichier XML par un script. J'ai déjà celui qui vérifie les mises à jour du XML que j'ai.

en utilisant la commande zip
Désolé, j'utiliserais bien la commande zip pour faire ce genre de choses mais le problème est que le script est en fait pour un téléphone Android et zip n'est pas une commande que je peux utiliser, malheureusement désolé d'avoir oublié cela. J'aurais bien utilisé zip si j'avais pu mais je n'ai que unzip pour droid et puis il y a tar dans busybox mais tar ne fait pas ce dont j'ai besoin.

88voto

user738048 Points 465

Essayez ce qui suit :

zip [zipfile] [file to update] 

Un exemple :

$ zip test.zip test/test.txt
updating: test/test.txt (stored 0%)

86voto

cayhorstmann Points 1274

J'ai trouvé le logiciel Linux zip est encombrant pour remplacer un seul fichier dans un fichier zip. Les jar du kit de développement Java peut s'avérer plus facile. Prenons l'exemple d'une tâche courante qui consiste à mettre à jour WEB/web.xml dans un fichier JAR (qui n'est autre qu'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'accès à un répertoire contenant le fichier WEB-INF (qui contient à son tour web.xml ).

71voto

PleaseStand Points 16718

En zip(1) :

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

Il suffit donc d'utiliser la fonction zip comme vous le feriez normalement pour créer un nouveau fichier .zip ne contenant que ce seul fichier, sauf que le nom de fichier .zip que vous spécifiez sera l'archive existante.

16voto

Ethan Strider Points 5373

Utiliser l'indicateur de mise à jour : -u

Exemple :

zip -ur existing.zip myFolder

Cette commande permet de compresser et d'ajouter myFolder (et son contenu) dans le existing.zip .


Utilisation avancée :

Le drapeau de mise à jour compare les fichiers entrants avec les fichiers existants et ajoute de nouveaux fichiers ou met à jour les fichiers existants.

Par conséquent, si vous souhaitez ajouter/mettre à jour un sous-répertoire spécifique dans le fichier zip, il vous suffit de mettre à jour la source comme vous le souhaitez, puis de ré-zipper l'ensemble de la source à l'aide de l'option -u drapeau. Seuls les fichiers modifiés seront compressés.

Si vous n'avez pas accès aux fichiers sources, vous pouvez décompresser le fichier zip, mettre à jour les fichiers souhaités, puis recompresser le fichier avec l'option -u drapeau. Là encore, seuls les fichiers modifiés seront compressés.

Exemple :

Structure de la source originale

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

Mise à jour de la structure de la source

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

Utilisation

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

13voto

traditional Points 128

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

Voici ce que j'ai fait. Création d'un répertoire temporaire abc . Copié file.zip to 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 , a exécuté 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X