So aktualisieren Sie eine Datei in einem Zip-Archiv

86

Ist es möglich, eine Datei in einer Zip-Datei zu ersetzen, ohne die alte Datei zu entpacken, die neue Datei hinzuzufügen und wieder zu entpacken?

Grund ist, dass ich eine Zip-Datei habe, die wirklich groß ist. In der Zip-Datei befindet sich eine XML-Datei, die ich manchmal aktualisieren muss. Das Entpacken und erneute Entpacken dauert lange. Ich möchte also nur die eine XML in der Zip-Datei durch ein Skript ersetzen können. Ich habe bereits die Überprüfung auf Updates auf der XML, die ich habe.

Ist es also möglich, nur die eine XML zu ersetzen, ohne sie zu entpacken und erneut zu entpacken?

Tut mir leid, dass ich den Befehl zip verwenden würde, um solche Dinge zu tun, aber das Problem ist, dass das Skript tatsächlich für ein Android-Telefon ist und zip kein Befehl ist, den ich leider verwenden kann. Tut mir leid, dass ich das ausgelassen habe. Ich hätte auf jeden Fall zip verwendet, wenn ich könnte, aber ich habe nur entpacken für Droiden und dann gibt es Teer in der Busybox, aber Teer macht nicht das, was ich brauche

user577732
quelle
3
Können Sie den Fragentitel in einen aussagekräftigeren ändern?
Tokand
7
Die Frage könnte auch ein oder zwei Sätze gewesen sein. Etwa 80% davon wandern.
Bis auf weiteres angehalten.

Antworten:

62

Von Reißverschluss (1) :

Wenn der Name eines vorhandenen Zip-Archivs angegeben wird, ersetzt zip Einträge mit identischem Namen im Zip-Archiv oder fügt Einträge für neue Namen hinzu.

Verwenden Sie den zipBefehl einfach wie gewohnt, um eine neue ZIP-Datei zu erstellen, die nur diese eine Datei enthält. Der angegebene ZIP-Dateiname ist jedoch das vorhandene Archiv.

PleaseStand
quelle
5
Könnte jemand bitte ein Beispiel geben? Ich verstehe die Hilfe des Zip-Befehls nicht.
Gustave
12
Angenommen, Sie haben myfolder mit gezippt, zip -r myfolder.zip myfolderwenn Sie aktualisieren möchten myfolder/otherfolder/myfile.txt, die Datei bearbeiten und ausführenzip -r myfolder.zip myfolder/otherfolder/myfile.txt
eakkas
1
Wie geht das, wenn die zu ersetzende Datei nicht denselben Namen oder dieselbe Struktur hat wie die neu zu repalzende Datei?
Fractaliste
2
@Fractaliste Sie müssen es den gleichen Namen und die gleiche Struktur haben;)
Hack5
72

Ich habe festgestellt, dass die Linux- zipDatei umständlich ist, um eine einzelne Datei in einer Zip-Datei zu ersetzen. Das jarDienstprogramm aus dem Java Development Kit ist möglicherweise einfacher. Betrachten Sie die allgemeine Aufgabe des Aktualisierens WEB/web.xmlin einer JAR-Datei (die nur eine Zip-Datei ist):

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

Hier path/to/dirist der Pfad zu einem Verzeichnis, das das WEB-INFVerzeichnis enthält (das wiederum enthält web.xml).

Cayhorstmann
quelle
Was ist, wenn ich nur die Datei kopieren muss, anstatt einen Director zu erstellen, WEB-INFder diese Datei enthält?
Helfende Hand
Auch in meinem Fall hat der liebe alte "jar" util den Trick gemacht! Vielen Dank!
Bitfox
51

Versuche Folgendes:

zip [zipfile] [file to update] 

Ein Beispiel:

$ zip test.zip test/test.txt
updating: test/test.txt (stored 0%)
user738048
quelle
2
Dies ist dank des Beispiels am einfachsten zu verstehen, danke!
Vatsug
2
Berücksichtigen Sie, dass Sie sehen sollten, updating:anstatt adding:ob Sie eine Datei in der Zip-Datei aktualisieren möchten. Andernfalls fügen Sie der Zip-Datei Dateien hinzu und ersetzen sie nicht.
Edenshaw
Du hast recht, das habe ich nicht bemerkt. Aktualisiert, danke!
user738048
13

Ich weiß, dass dies eine alte Frage ist, aber ich wollte das Gleiche tun. Aktualisieren Sie eine Datei im Zip-Archiv. Und keine der obigen Antworten hat mir wirklich geholfen.

Hier ist was ich getan habe. Temporäres Verzeichnis erstellt abc. Kopiert file.zipzu abcund die Datei in das Verzeichnis extrahiert. Ich habe die Datei bearbeitet, die ich bearbeiten wollte. Führen Sie dann während Ihres abcAufenthalts den folgenden Befehl aus

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

-u switch sucht nach geänderten / neuen Dateien und fügt sie dem Zip-Archiv hinzu.

traditionell
quelle
11

Verwenden Sie das Update-Flag: -u

Beispiel:

zip -ur existing.zip myFolder

Dieser Befehl komprimiert und fügt myFolder(und seinen Inhalt) dem hinzu existing.zip.


Erweiterte Verwendung:

Das Update-Flag vergleicht die eingehenden Dateien tatsächlich mit den vorhandenen und fügt entweder neue Dateien hinzu oder aktualisiert vorhandene.

Wenn Sie daher ein bestimmtes Unterverzeichnis in der Zip-Datei hinzufügen / aktualisieren möchten, aktualisieren Sie einfach die Quelle wie gewünscht und komprimieren Sie dann die gesamte Quelle mit dem -uFlag erneut. Nur die geänderten Dateien werden komprimiert.

Wenn Sie keinen Zugriff auf die Quelldateien haben, können Sie die Zip-Datei entpacken, die gewünschten Dateien aktualisieren und dann mit dem -uFlag erneut komprimieren . Auch hier werden nur die geänderten Dateien komprimiert.

Beispiel:

Ursprüngliche Quellstruktur


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

Aktualisierte Quellstruktur


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

Verwendung

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

Sie können Folgendes verwenden: zip -u file.zip path / file_to_update

Renato Luiz Ramos
quelle
1

Es gibt auch die Option -f, mit der die Zip-Datei aktualisiert wird. Es kann verwendet werden, um ALLE Dateien zu aktualisieren, die seit der Generierung der Zip-Datei aktualisiert wurden (vorausgesetzt, sie befinden sich an derselben Stelle innerhalb der Baumstruktur in der Zip-Datei).

Wenn Ihre Datei den Namen /myfiles/myzip.zip trägt, müssen Sie nur noch

zip -f /myfiles/myzip.zip
gvrocha
quelle
0

Von der Seite der ZIP-Archivstruktur aus - Sie können die ZIP-Datei aktualisieren, ohne sie erneut zu komprimieren. Sie müssen lediglich alle Dateien überspringen, die vor der zu ersetzenden Datei liegen, dann Ihre aktualisierte Datei und dann den Rest der Dateien ablegen. Und schließlich müssen Sie die aktualisierte zentrale Verzeichnisstruktur einfügen. Ich bezweifle jedoch, dass die meisten gängigen Tools dies ermöglichen würden.

Nickolay Olshevsky
quelle
0

7zip (7za) kann zum Hinzufügen / Aktualisieren von Dateien / Verzeichnissen verwendet werden:

Beispiel: Ersetzen (unabhängig vom Dateidatum) der MANIFEST.MFDatei in einer JAR-Datei. Das /source/META-INFVerzeichnis enthält die MANIFEST.MFDatei, die Sie in die jar(zip) einfügen möchten :

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

Nur aktualisieren (ersetzt das Ziel nicht, wenn die Quelle älter ist)

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

Ja es ist möglich.

Auf Linux-basierten Systemen installieren Sie einfach zip und Sie können es in der Befehlszeile aufrufen. Schauen Sie sich die Manpage an: http://linux.die.net/man/1/zip

Nach meiner persönlichen Erfahrung funktioniert dies jedoch besser mit einfachen TAR-Dateien und TAR, wenn dies möglich ist und die Komprimierung nicht so wichtig ist.

Der Surrican
quelle