C'è un modo per modificare i file all'interno di un file zip senza prima estrarli esplicitamente?


47

A volte ho bisogno di apportare modifiche a un file .zip o .jar, quindi di solito sposto il file in /tmp, estraggo tutti i file con unzip, modifico alcuni file e quindi comprimo nuovamente i file. Funziona, ma può essere noioso. Esiste un programma di utilità o uno script di shell che posso usare per modificare un file all'interno di un file zip senza chiamare esplicitamente unzipe zip(anche se è solo un wrapper attorno a questi comandi)?


Solo curioso se la risposta funziona su file .jar? (Non l'ho provato lì.)
Beroe

@beroe Dovrebbe essere visto che quelli usano l'algoritmo di compressione zip. Questa era in realtà la mia motivazione principale per cercare una soluzione perché avevo file .war distribuiti su un server di app che non avevo voglia di ri-impacchettare e reimplementare solo per modificare un singolo file.
austin,

Grande. Proverò a riparare la funzione in modo da preservare la struttura delle directory all'interno dell'archivio. Attualmente penso che funzioni solo su file a livello di root, ma per i miei scopi le sottocartelle sono più utili.
beroe,

@beroe Questo è abbastanza bello. Prima di chiedere questo, stavo per codificare uno script Python per lanciare una psudo-shell "dentro" il file zip per eseguire comandi arbitrari. Sarei interessato a quello che ti viene in mente.
austin,

OK, ha aggiunto un'altra soluzione per supportare le sottocartelle e funziona con test limitati .
beroe,

Risposte:


19

Conosci il nome del file nell'archivio prima di decomprimerlo? È possibile creare una funzione per decomprimere /tmp, modificare e aggiornare lo zip:

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

Come si dice, l'utilizzo è:

zipedit myarchive.zip myfile.txt

Questo decomprime il file nominato dall'archivio, lo salva /tmp, lo modifica e lo viaggiunge nuovamente all'archivio, mentre "ripulisce" il percorso. Aggiungi al tuo .bash_profile, assumendo bash...

MODIFICA: Di seguito è riportata una versione che funziona con le sottocartelle all'interno dell'archivio ... Nota, non utilizzare una barra prima del nome della cartella (ovvero myfolder/file.txtnon utilizzare /myfolder/file.txt). Se modifichi un file che non esisteva già nell'archivio, lo creerà per te. Inoltre, non sono sicuro che funzionerà con il percorso assoluto del file zip. Stick migliore con relativo.

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"
}

Grazie per la domanda Probabilmente finirò per usare anche questo!

Un'altra modifica: non testato, ma l'ho letto vimed emacsentrambi modificherò direttamente i file jar?


Posso confermare che vim funziona magnificamente per la modifica di file zip dalla riga di comando su Linux, grazie mille per il suggerimento!
Thomas Bindzus,

60

Vim supporta la modifica trasparente di file all'interno di file zip. Esegui solo:

vim file.zip

e ti verrà mostrato un elenco di file all'interno dell'archivio zip. Scegli quello che vuoi modificare, cambia quello che vuoi, ed esci con: x

Se vimrisponde con:

Impossibile apportare modifiche, "modificabile" è disattivato

.. basta eseguire :set modifiableo :set ma(fonte: https://stackoverflow.com/questions/5745506/vim-modifiable-is-off )


2
A proposito, il supporto zip predefinito in vim consente solo la modifica di ZIP di un livello. Se devi modificare ZIP all'interno di ZIP, dovresti usare questo plugin vim .
jesjimher,

1
Lo stesso con emacs.
Mike,

4
Questa dovrebbe essere contrassegnata come la risposta giusta
Martijn Burger,

3
salvavita. caratteristica davvero interessante di vim, e anche abbastanza inaspettata
Peter Perháč

4

Risposta breve: NO.

Se si tratta di un wrapper, che si sta chiamando questi comandi. Ad ogni modo, il meglio che mi viene in mente è aprire il file usando file-roller, se ci si trova in un ambiente X, che potrebbe funzionare con un semplice doppio clic, a seconda della configurazione. È quindi possibile fare doppio clic sul file compresso per aprirlo e quindi è possibile modificarlo:

$ file-roller b3.zip 

Quando salvi il file modificato, dovresti visualizzare questa finestra di dialogo:

Potresti creare uno script anche per questo, ma ciò diventa complicato se hai archivi compressi che contengono più file. Fammi sapere se è quello che ti serve e potrei essere in grado di cucinare qualcosa.

inserisci qui la descrizione dell'immagine


0

Breve risposta pedante; no. Se pensi alla compressione, stai usando la ridondanza per accorciare i file all'interno, quindi qualsiasi modifica cambia l'intero file all'interno dell'archivio, possibilmente l'archivio.

Se sei meno teorico, più pratico, più "Non voglio decomprimere / comprimere manualmente" ci sono strumenti che puoi usare. ark su Linux è quello che ho usato. Puoi anche montare l'archivio con fuse-zip , anche se probabilmente è più lavoro di un file temporaneo.


non so perché qualcuno abbia dato -1. +1 per fuse-zip.
myrdd,

0

Secondo la pagina man di zip(versione online per un facile riferimento: http://linux.die.net/man/1/zip ), il zipcomando ha un -uflag che descrive come:

Sostituisci (aggiorna) una voce esistente nell'archivio zip solo se è stata modificata più di recente rispetto alla versione già presente nell'archivio zip.


0

Il file manager di Directory Opus 12 ti permetterà di sfogliare Zip, quindi trascinare e rilasciare il file modificato da un'altra cartella in esso e sovrascrivere il file che vuoi modificare, e farà tutto al volo. Molto facile



0

Ad esempio puoi usare l'editor di testo KDE standard:

  1. apri archivio in gestore archivi
  2. apri il file di testo nell'editor gui di KDE
  3. salva il file di testo e il sistema ti chiede di aggiornare l'archivio - fai clic su Sì
  4. non dimenticare il permesso per l'archivio e la cartella dell'archivio (il mio errore preferito)

Correggi la formattazione del tuo post.
davidbaumann,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.