Wie kombiniere / verschmelze ich Zip-Dateien?

21

In den letzten Monaten habe ich wöchentlich mehrere Datenordner in Zip-Dateien kopiert. Jetzt möchte ich diese ZIP-Dateien in einer ZIP-Datei zusammenfassen, da die meisten Inhalte der vorhandenen ZIP-Dateien nur unterschiedliche Versionen derselben Datendateien sind.

Wenn also eine Datei in mehr als einer der vorhandenen ZIP-Dateien enthalten ist, möchte ich, dass die neueste Version in der neu erstellten ZIP-Datei enthalten ist. Wenn eine Datei nur in einer vorhandenen Zip-Datei erscheint, möchte ich sie natürlich auch in der endgültigen Zip-Datei haben.

Ich versuche zu vermeiden, sie einzeln in einen Arbeitsordner entpacken zu müssen, Daten aus älteren ZIP-Dateien mit Daten aus neueren ZIP-Dateien zu überschreiben und dann alles in eine neue ZIP-Datei zu packen.

Soweit ich weiß, würde pkzip die ZIP-Dateien selbst kombinieren. Gibt es jedoch eine zuverlässige und schnelle kostenlose Methode, über die mir jemand etwas sagen kann?

CChriss
quelle
1
zipmerge für den Sieg
Code Bling

Antworten:

7

Sie werden es nicht mögen, aber: Entpacken Sie alles in der richtigen Reihenfolge in einen Arbeitsordner. Dann ist das Komprimieren des Ergebnisses der effektivste Weg.

Andernfalls entstehen viele verschwendete CPU-Zyklen:

  • Angenommen, Ihr Ergebnis geht an 'first.zip'.
  • Jede Datei aus '2.zip', '3.zip' usw. muss entpackt und dann erneut in 'first.zip' gepackt werden
  • In '2.zip' existiert eine Datei 'foobar.txt' und in '3.zip' existiert eine andere Datei 'foobar.txt'. Wenn Sie es so zusammenführen, wie Sie es zusammenführen möchten, wird es X-mal komprimiert.
  • Der toc einer .zip-Datei befindet sich am Ende der Datei: Sie fügen mehr Inhalt hinzu (in die Mitte der
    .zip-Datei, indem Sie eine Datei in der Mitte aktualisieren), und die gesamte Datei muss neu geschrieben werden

Also, imho benutze einfach ' unzip ' wiseley:

% mkdir all
% for x in *.zip ; do unzip -d all -o -u $x ; done
% zip -r all.zip all

Die Reihenfolge des Entpackens ist wichtig, ich kenne das Muster Ihrer Zip-Namen nicht, aber ich würde die neueste Zip-Datei zuerst extrahieren. Die Option '-u' zum Entpacken überschreibt nur Dateien, wenn sie neuer sind, oder erstellt Dateien, wenn nicht schon da. Infolgedessen entpacken Sie nur die neuesten Dateien und komprimieren das Ergebnis nur einmal.

Akira
quelle
Dies ist aus Anwendersicht möglicherweise am effektivsten, aber nicht korrekt. Die Dateitabelle in einer Zip-Datei befindet sich zwar am Ende, Sie können jedoch beliebig Dateien an das Ende einer beliebigen Zip-Datei schreiben und anschließend eine neue Dateitabelle erstellen. Der letzte Rekord gewinnt immer. Diejenigen, die ein wenig mit Skripten oder Programmieren vertraut sind, können diesen gesamten Prozess ausführen, ohne Dateien zu dekomprimieren oder zu komprimieren, indem sie einfach die Binärblöcke verschieben und die Zip-Tabelle aktualisieren.
Caesay
Tatsächlich können Sie einfach alle Zip-Dateien in einer einzigen Datei zusammenfassen (in der von Ihnen gewünschten Reihenfolge) und dann am Ende einen neuen Dateidatensatz schreiben, der nur die neuesten Versionen von Dateien enthält. Dies hat den zusätzlichen Vorteil, dass die Zip-Datei weiterhin alle früheren Versionen von Dateien enthält, die bei Bedarf wiederhergestellt werden können
am
"Jede Datei aus '2.zip', '3.zip' usw. muss entpackt und dann erneut in 'first.zip' komprimiert werden" ist nicht korrekt. Das zipmergeDienstprogramm führt z. B. ZIP-Archive zusammen, ohne sie zu dekomprimieren und erneut zu komprimieren.
ZachB
Ich habe unzipping/ zippingund nicht uncompress / decompress. Ja, natürlich kann man einen Eintrag von 2.zip(dem komprimierten Blob) nehmen und in übertragen first.zipund somit muss keine "Komprimierung" stattfinden. Aber Sie müssen den Blob extrahieren 2.zip, das Vorhandensein im Inhaltsverzeichnis von nachschlagen first.zip, wenn es entweder den vorhandenen Eintrag ersetzt (was bedeutet, dass Sie die gesamte Datei im Grunde neu schreiben müssen) oder am Ende anfügt - und danach müssen Sie hänge den toc des zip an. Ich verstehe nicht, wie zipmergeman das Zusammenführen von Zip-Einträgen auf eine andere Art und Weise erreichen kann (Komprimierung beiseite)
akira
-1 weil es weitaus effizientere Möglichkeiten gibt, diese Aufgabe zu erledigen, und keine der Begründungen dafür, dass dies "der effektivste Weg" ist, macht ein wenig Sinn. every file [...] has to be unzipped and then zipped again- nein, das ist deine Lösung. in '2.zip' exists a file 'foobar.txt' and in '3.zip' exists another file 'foobar.txt'. merging it the way you want to merge it leads to 'compress it X times'- Nein, tut es nicht. Warum sollte es? you add more content [...] and the whole file has to be rewritten- nein, Sie schreiben die Ausgabe in einem Durchgang. Warum hat das jemand positiv bewertet?
9.
4

Verwenden Sie einfach die Option -g von ZIP, mit der Sie eine beliebige Anzahl von ZIP-Dateien anhängen können (ohne die alten zu extrahieren). Dies spart Ihnen viel Zeit.

Schauen Sie sich auch zipmerge an

Christos
quelle
4
-gFügt Dateien zu einer vorhandenen Zip-Datei hinzu. es verschmilzt sie nicht. Beispiel: Fügt zip -g result.zip other.zipdie Datei other.zipin result.zip . --grow ein. Vergrößert das angegebene ZIP-Archiv ( hängt es an dieses an), anstatt ein neues zu erstellen. Wenn dieser Vorgang fehlschlägt, versucht zip, das Archiv in seinem ursprünglichen Zustand wiederherzustellen. Wenn die Wiederherstellung fehlschlägt, kann das Archiv beschädigt werden. Diese Option wird ignoriert, wenn kein Archiv vorhanden ist oder wenn mindestens ein Archivmitglied aktualisiert oder gelöscht werden muss.`
akira
2

https://linux.die.net/man/1/zipmerge :

Mit zipmerge werden die Quell-Zip-Archive source-zipmit dem Ziel-Zip-Archiv zusammengeführt target-zip. Standardmäßig überschreiben Dateien in den Quell-Zip-Archiven vorhandene Dateien mit demselben Namen im Ziel-Zip-Archiv.

imz - Ivan Zakharyaschev
quelle
1

Ich dachte, Sie könnten die zu extrahierenden Dateien in ein temporäres Verzeichnis schreiben.

Es gibt ein Problem mit dieser Befehlszeile. Ich habe keine Möglichkeit gefunden, das Entpacken von Archiven zu bestellen, sodass ein älteres Archiv möglicherweise ein neueres Archiv überschreibt. Dieses Problem kann durch die Verwendung eines Entpackers behoben werden, der über eine Befehlszeilenoption verfügt, mit der nur überschrieben werden kann, wenn eine neuere Version vorliegt. Ich verwende hauptsächlich 7-Zip, das keine solche Befehlszeilenoption hat.

Für diesen Befehl müssen sich alle ZIP-Dateien im selben Verzeichnis befinden. Kein Problem, wenn alle Reißverschlüsse eindeutige Namen haben. Der Befehl kann jedoch an Ihre Situation angepasst werden.

for /f %f in ('dir /b *.zip') do "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoa

Um dies zu ändern und ein anderes Dekomprimierungsprogramm zu verwenden, ersetzen "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoaSie es einfach durch den Befehl, den Sie für jede Datei ausführen würden. Verwenden Sie %fals Platzhalter den Namen der Datei, die Sie entpacken möchten.

Ich habe versucht, eine polierte App zu suchen, kostenlos oder auf andere Weise und habe keine wirklich gefunden.

Hoffentlich erhalten Sie einen guten Start, und WinZip oder ähnliches kann das Überschreibproblem beheben.

Viel Glück.

Scott McClenning
quelle
0

Wenn ich mich richtig erinnere, pkzip ein Kommandozeilenprogramm.

Es gibt immer noch eine Befehlszeilenversion von ZIP, die behauptet, mit pkzip kompatibel zu sein.

Es heißt Info-ZIP und es sollte eine Version für Ihr Betriebssystem geben.

Pavium
quelle
Hat es die Funktionalität, nach der ich frage? Ich kann nicht finden, wo diese Fähigkeit aufgelistet ist.
CChriss
1
Die Info-Zip-Suite macht Dateien mit PKZip kompatibel, aber die Programme selbst unterscheiden sich und scheinen keine Zusammenführungsoption zu enthalten.
CarlF
OK, sorry, ich konnte Info-Zip vor vielen Jahren auf einer Apollo-Workstation unter DOMAIN / OS kompilieren und ausführen. Ich erinnere mich, dass es schon damals unter DOS / VMS / Unix und einigen anderen verschiedene Funktionen gab. Ich nehme an, es hat sich weiterentwickelt.
Pavium
0

Suchen Sie im Internet nach der winzip-Befehlszeile. Winzip verfügt über mehrere Versionen von Befehlszeilenprogrammen, die auf die von Ihnen möglicherweise installierte Version von Winzip passen. Das Befehlszeilentool WZZIP verfügt über die Option -f "Aktualisieren", mit der neuere Dateien nur komprimiert werden, wenn sie dem Namen einer Datei in der komprimierten Summierungsausgabedatei entsprechen.

Verwenden Sie WZunzip, das wie oben gezeigt in eine FOR-Anweisung eingeschlossen ist, um eine Datei in ein Verzeichnis zu entpacken, und dann WZzip -f, um diese Dateien zu einer Ausgabesummierungs-Zip-Datei hinzuzufügen. Anschließend wird die FOR-Schleife wiederholt, um die nächste Eingabedatei zu bearbeiten und in die einzige Summierungsausgabedatei auszugeben. Die Reihenfolge der Eingabedateien spielt keine Rolle, da WZzip -f nur dann zur Ausgabedatei hinzugefügt wird, wenn die Eingabedaten neuer sind als die bereits in der Ausgabedatei enthaltenen. Alle Dateien, die nicht in der Ausgabedatei vorhanden sind, werden ebenfalls hinzugefügt. Anschließend können Sie das Ergebnis in einen Ordner entpacken und erneut komprimieren, um eine effizient gepackte Ergebnisdatei zu erhalten. Sie können dies sogar automatisch nach der FOR-Schleife am Ende der Batch-Datei tun.

eewiz
quelle