Come aggiornare un file in un archivio zip


88

È possibile sostituire un file in un file zip senza decomprimere l'eliminazione del vecchio file aggiungendo il nuovo file e ricomprimendolo?

Il motivo è che ho un file zip che è davvero grande, c'è un xml all'interno del file zip che devo aggiornare a volte. Decomprimere e richiudere la zip richiede molto tempo. Quindi mi piacerebbe solo essere in grado di sostituire l'unico xml all'interno dello zip tramite uno script. Ho già quel controllo per gli aggiornamenti sull'xml che ho.

Quindi è possibile sostituire solo l'xml senza decomprimere e decomprimere?

Scusa, vorrei usare il comando zip per fare cose del genere, ma il problema è che lo script è in realtà per un telefono Android e zip non è un comando che posso usare purtroppo mi dispiace di averlo lasciato fuori. Avrei usato definitivamente zip se potessi, ma ho solo unzip per droid e poi c'è tar in busybox ma tar non fa quello che mi serve


3
puoi cambiare il titolo della domanda in qualcosa di più significativo?
Tokland

7
Inoltre, la domanda avrebbe potuto essere una o due frasi. Circa l'80% è irregolare.
Dennis Williamson,

Risposte:


63

Da zip (1) :

Quando viene assegnato il nome di un archivio zip esistente, zip sostituirà le voci con lo stesso nome nell'archivio zip o aggiungerà voci per nuovi nomi.

Quindi usa il zipcomando come faresti normalmente per creare un nuovo file .zip contenente solo quel file, eccetto che il nome del file .zip che specifichi sarà l'archivio esistente.


5
Qualcuno potrebbe fare un esempio, per favore? Non capisco l'aiuto del comando zip.
Gustave

12
Supponiamo che tu abbia zippato myfolder usando zip -r myfolder.zip myfolderse vuoi aggiornare myfolder/otherfolder/myfile.txt, vai avanti e modifica il file ed eseguizip -r myfolder.zip myfolder/otherfolder/myfile.txt
eakkas

1
Come fare se il file da sostituire non ha lo stesso nome né la stessa struttura del file da sostituire?
Fractaliste

2
@Fractaliste Devi farlo avere lo stesso nome e struttura;)
Hack5

75

Ho trovato il zipfile Linux ingombrante per la sostituzione di un singolo file in uno zip. L' jarutilità del Java Development Kit potrebbe essere più semplice. Considera l'attività comune di aggiornamento WEB/web.xmlin un file JAR (che è solo un file zip):

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

Ecco path/to/diril percorso di una directory contenente la WEB-INFdirectory (che a sua volta contiene web.xml).


cosa succede se devo copiare solo il file invece di creare un regista WEB-INFche ha quel file.
Mano

Anche nel mio caso, il caro vecchio "barattolo" util ha fatto il trucco! Grazie!
bitfox

52

Prova quanto segue:

zip [zipfile] [file to update] 

Un esempio:

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

2
Questo è il più facile da capire grazie all'esempio, grazie!
vatsug

2
Tieni presente che dovresti vedere al updating:posto di adding:se vuoi aggiornare un file all'interno dello zip; altrimenti stai aggiungendo file allo zip, non sostituendolo.
Edenshaw

Hai ragione, non l'ho notato. Aggiornato, grazie!
WizardsOfWor

13

So che questa è una vecchia domanda, ma volevo fare lo stesso. Aggiorna un file nell'archivio zip. E nessuna delle risposte precedenti mi ha davvero aiutato.

Ecco cosa ho fatto. Directory temporanea creata abc. Copiato file.zipa abced estratto il file in quella directory. Ho modificato il file che volevo modificare. Quindi, mentre si abctrovava, ha eseguito il seguente comando

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

-u switch cercherà i file modificati / nuovi e li aggiungerà all'archivio zip.


12

Usa il flag di aggiornamento: -u

Esempio:

zip -ur existing.zip myFolder

Questo comando comprimerà e aggiungerà myFolder(e il suo contenuto) al file existing.zip.


Utilizzo avanzato:

Il flag di aggiornamento confronta effettivamente i file in arrivo con quelli esistenti e aggiungerà nuovi file o aggiornerà quelli esistenti.

Pertanto, se si desidera aggiungere / aggiornare una sottodirectory specifica all'interno del file zip, aggiornare semplicemente l'origine come desiderato, quindi comprimere nuovamente l'intera origine con il -uflag. Verranno compressi solo i file modificati.

Se non hai accesso ai file di origine, puoi decomprimere il file zip, quindi aggiornare i file desiderati e quindi comprimere nuovamente con il -uflag. Anche in questo caso, verranno compressi solo i file modificati.

Esempio:

Struttura sorgente originale


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

Struttura sorgente aggiornata


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

Utilizzo

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


1

C'è anche l'opzione -f che aggiornerà il file zip. Può essere utilizzato per aggiornare TUTTI i file che sono stati aggiornati da quando è stato generato lo zip (supponendo che si trovino nella stessa posizione all'interno della struttura ad albero all'interno del file zip).

Se il tuo file si chiama /myfiles/myzip.zip, tutto ciò che devi fare è

zip -f /myfiles/myzip.zip

0

Dal lato della struttura dell'archivio ZIP: è possibile aggiornare il file zip senza ricomprimerlo, sarà sufficiente saltare tutti i file precedenti al file che è necessario sostituire, quindi inserire il file aggiornato e quindi il resto dei file. E infine dovrai inserire la struttura della directory centrale aggiornata. Tuttavia, dubito che gli strumenti più comuni ti permetterebbero di farlo.


0

7zip (7za) può essere utilizzato per aggiungere / aggiornare file / directory in modo corretto:

Esempio: sostituzione (indipendentemente dalla data del file) il MANIFEST.MFfile in un file JAR. La /source/META-INFdirectory contiene il MANIFEST.MFfile che vuoi mettere nello jar(zip):

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

Aggiorna solo (non sostituisce la destinazione se l'origine è precedente)

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

-2

si è possibile.

sui sistemi basati su Linux basta installare zip e puoi chiamarlo dalla riga di comando. dai un'occhiata alla manpage: http://linux.die.net/man/1/zip

ma nella mia esperienza personale, se possibile e la compressione non è così importante, funziona meglio con i file tar e tar.

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.