Est-il possible d'éditer des fichiers à l'intérieur d'un fichier zip sans les extraire explicitement au préalable?

47

Je dois parfois modifier un fichier .zip ou .jar. Je déplace donc généralement le fichier dans /tmp, extrait tous les fichiers unzip, édite quelques fichiers, puis re-zippe. Cela fonctionne, mais cela peut être fastidieux. Existe-t-il un utilitaire ou un script shell que je puisse utiliser pour modifier un fichier dans un fichier zip sans appeler explicitement unzipet zip(même s'il ne s'agit que d'un wrapper autour de ces commandes)?

austin
la source
Juste curieux de savoir si la réponse fonctionne sur des fichiers .jar? (Je ne l'ai pas testé ici.)
beroe
@Beroe Il convient que ceux-ci utilisent l'algorithme de compression zip. C’est en fait ma principale motivation à la recherche d’une solution, car j’avais déployé des fichiers .war sur un serveur d’applications que je n’avais pas envie de réemballer et de redéployer simplement pour modifier un seul fichier.
austin
Génial. Je vais essayer de corriger la fonction afin qu'elle préserve la structure de répertoires à l'intérieur de l'archive. Actuellement, je pense que cela ne fonctionne que sur les fichiers au niveau racine, mais pour mes besoins, les sous-dossiers sont plus utiles.
beroe
@Beroe C'est plutôt cool. Avant de poser cette question, j'allais coder un script python pour lancer un psudo-shell "à l'intérieur" du fichier zip afin d'exécuter des commandes arbitraires. Je serais intéressé par ce que vous proposez.
austin
OK, a ajouté une autre solution pour prendre en charge les sous-dossiers et fonctionne dans des tests limités .
Beroe

Réponses:

19

Connaissez-vous le nom du fichier dans l’archive avant de le décompresser? Vous pouvez créer une fonction pour décompresser /tmp, éditer et actualiser le zip:

zipedit(){
    echo "Usage: zipedit archive.zip file.txt"
    unzip "$1" "$2" -d /tmp 
    vi /tmp/$2 && zip -j --update "$1"  "/tmp/$2" 
}

Comme il est dit, l’utilisation est:

zipedit myarchive.zip myfile.txt

Cela décompresse le fichier nommé de l’archive, l’enregistre dans /tmp, l’édite vipuis le rajoute à l’archive tout en "jonglant" le chemin. Ajouter à votre .bash_profile, en supposant bash...

EDIT: Vous trouverez ci-dessous une version qui fonctionne avec des sous-dossiers à l’intérieur de l’archive ... Remarque, n’utilisez pas de barre oblique avant le nom du dossier (c’est-à-dire n’utilisez myfolder/file.txtpas /myfolder/file.txt). Si vous éditez un fichier qui n'existait pas déjà dans l'archive, il le créera pour vous. Aussi pas sûr si cela fonctionnera avec le chemin absolu du fichier zip. Meilleur bâton avec un parent.

zipedit(){
    echo "Usage: zipedit archive.zip folder/file.txt"
    curdir=$(pwd)
    unzip "$1" "$2" -d /tmp 
    cd /tmp
    vi "$2" && zip --update "$curdir/$1"  "$2" 
    # remove this line to just keep overwriting files in /tmp
    rm -f "$2" # or remove -f if you want to confirm
    cd "$curdir"
}

Merci pour la question. Je vais probablement finir par utiliser celui-ci aussi!

Une autre édition: non testée, mais j'ai lu cela vimet emacsles deux fichiers jar seront-ils édités directement?

Beroe
la source
Je peux confirmer que vim fonctionne à merveille pour l'édition de fichiers zip à partir de la ligne de commande sous Linux, merci beaucoup pour le conseil!
Thomas Bindzus
60

Vim prend en charge l’édition transparente de fichiers au sein de fichiers zip. Il suffit d'exécuter:

vim file.zip

et vous verrez une liste de fichiers dans l'archive zip. Choisissez celui que vous voulez éditer, changez ce que vous voulez et quittez avec: x

Si vimrépond avec:

Impossible d'apporter des modifications, 'modifiable' est désactivé

.. il suffit de courir :set modifiableou :set ma(source: https://stackoverflow.com/questions/5745506/vim-modifiable-is-off )

jesjimher
la source
2
Soit dit en passant, la prise en charge du zip par défaut dans vim permet uniquement la modification de fichiers ZIP à un niveau. Si vous avez besoin d'éditer des ZIP dans des ZIP, vous devez utiliser ce plugin vim .
jesjimher
1
Même chose avec Emacs.
Mike
4
Cela devrait être marqué comme la bonne réponse
Martijn Burger
3
épargnant de vie. fonction vraiment cool de vim, et assez inattendue aussi
Peter Perháč
4

Réponse courte: NON.

Si c'est un wrapper, vous êtes appelez ces commandes. Quoi qu'il en soit, le mieux que je puisse faire est d'ouvrir le fichier en utilisant file-roller, si vous êtes dans un environnement X, cela pourrait fonctionner avec un simple double-clic, en fonction de votre configuration. Vous pouvez ensuite double-cliquer sur le fichier compressé pour l'ouvrir puis vous pouvez l'éditer:

$ file-roller b3.zip 

Lorsque vous enregistrez votre fichier modifié, vous devriez obtenir cette boîte de dialogue:

Vous pouvez également créer un script pour cela, mais cela devient compliqué si vous avez des archives compressées contenant plusieurs fichiers. Faites-moi savoir si c'est ce dont vous avez besoin et je pourrais peut-être cuisiner quelque chose.

entrez la description de l'image ici

terdon
la source
0

Courte réponse pédante; non. Si vous songez à la compression, vous utilisez la redondance pour raccourcir les fichiers, de sorte que toute modification modifie l’ensemble du fichier dans l’archive, éventuellement l’archive.

Si vous êtes moins théorique, plus pratique, plus "Je ne veux pas avoir à décompresser / zipper manuellement", il existe des outils que vous pouvez utiliser. ark sur Linux est celui que j'ai utilisé. Vous pouvez également monter l'archive avec fuse-zip , bien que ce soit probablement plus de travail qu'un fichier temporaire.

Rich Homolka
la source
Je ne sais pas pourquoi quelqu'un a donné -1. +1 pour fuse-zip.
Myrdd
0

Selon la page de manuel for zip(version en ligne pour référence facile: http://linux.die.net/man/1/zip ), la zipcommande a un -udrapeau qu’elle décrit comme suit:

Remplacez (mettez à jour) une entrée existante dans l'archive zip uniquement si elle a été modifiée plus récemment que la version déjà présente dans l'archive zip.

Procureur
la source
0

Le gestionnaire de fichiers Directory Opus 12 vous permettra de parcourir le fichier Zip, de glisser-déposer le fichier modifié dans un autre dossier et d’écraser le fichier que vous souhaitez modifier. Le tout à la volée. Très facile

Technométrie
la source
0

J'ai écrit un plugin Vim qui étend les fichiers zip.vim à la navigation et à l'édition de fichiers zip imbriqués.

https://github.com/lbrayner/vim-rzip

lbrayner
la source
comment l'installez-vous sur linux?
Pandrei
J'ai ajouté des instructions d'installation au fichier README du référentiel . S'il vous plaît vérifier à nouveau.
lbrayner le
0

Vous pouvez utiliser l'éditeur de texte KDE standard, par exemple:

  1. archive ouverte dans le gestionnaire d'archives
  2. Ouvrir un fichier texte dans l'éditeur KDE gui
  3. enregistrer le fichier texte et le système vous demandent d'actualiser l'archive - cliquez sur oui
  4. n'oubliez pas la permission pour archive et le dossier d'archive (mon erreur préférée)
tvorez
la source
Veuillez corriger le formatage de votre message.
davidbaumann