Mit der GUI erstellte ZIP-Dateien haben mehr Bytes als in einer Shell erstellte ZIP-Dateien

15

Ich habe zwei ZIP- Dateien desselben Verzeichnisses erstellt. Eine mit der GUI, die andere mit:

$ zip -r alpha_cmd.zip Alpha

Das Alpha- Verzeichnis ist 33,640 MB groß und umfasst 164 Elemente.

Die von der GUI erstellte ZIP-Datei ist 2.100 Byte größer als die in der Befehlszeile erstellte ZIP-Datei.

Warum ist die mit der GUI erstellte ZIP-Datei größer?

Hinweis : Auch wenn die ZIP-Dateien beim Entpacken unterschiedlich groß sind, hat jedes Verzeichnis genau die gleiche Anzahl von Bytes. Grundsätzlich bin ich sehr vorsichtig mit möglichen Inkonsistenzen, die durch die Verwaltung meines Dateisystems mit der GUI und mit Shell-Befehlen entstehen.

David
quelle
Einer kann unsichtbare Dateien haben, der andere nicht?
Tetsujin
Aus dieser SU Antwort tryditto -ck --rsrc --sequesterRsrc --keepParent folder folder.zip
user151019
@Mark Ich habe vergessen zu antworten. Dieser Befehl "ditto" erstellt genau die gleiche Datei wie Finder. Und die ditto / zip / "Finder ZIP" -Dateien sind plattformübergreifend. Vielen Dank für Ihre Zeit und Mühe.
David

Antworten:

20

Durch das Zippen aus dem Finder wird ein auf Macs unsichtbarer Ordner __MACOSX hinzugefügt, der OS X-Ressourcengabeln wie benutzerdefinierte Symbole und dergleichen enthält. Aus Wikipedia :

Der Ressourcenzweig ist ein Zweig oder ein Abschnitt einer Datei auf dem Apple Mac OS-Betriebssystem, in dem strukturierte Daten zusammen mit den unstrukturierten Daten gespeichert werden, die im Datenzweig gespeichert sind. Ein Ressourcenzweig speichert Informationen in einer bestimmten Form, die Details wie Symbol-Bitmaps, Fensterformen, Menüdefinitionen und deren Inhalt sowie Anwendungscode (Maschinencode) enthalten. Beispielsweise kann eine Textverarbeitungsdatei ihren Text in der Datengabelung speichern, während eingebettete Bilder in der Ressourcengabelung derselben Datei gespeichert werden. Der Ressourcenzweig wird hauptsächlich von ausführbaren Dateien verwendet, aber jede Datei kann einen Ressourcenzweig haben.

empedocle
quelle
6
Kleinere Korrekturen: Es handelt sich nicht nur um Ressourcengabeln, sondern um alle Arten von Dateimetadaten , die vom ZIP-Format nicht nativ verarbeitet werden und im AppleDouble- Format codiert sind . Dazu gehören Spotlight-Kommentare, Tags, Finder-Flags, Quarantänedaten usw. sowie Ressourcengabeln.
Gordon Davisson
Und ich habe mich gefragt, was der "__MACOSX" -Ordner in den meisten Reißverschlüssen ist ... Je mehr Sie wissen, wie?
Ave
Ein weiterer Hinweis, der die Antwort erhellen könnte: stackoverflow.com/questions/107903/…
DA Vincent
4

Sogar abgesehen von der Hauptursache in diesem Fall (Finder fügt, wie Empedocle sagt, zusätzliches verstecktes Material hinzu), sind unterschiedliche Größen für ZIPs mit denselben Daten kein Problem, wenn der Größenunterschied ein Bruchteil eines Prozents beträgt.

Verschiedene ZIP-Implementierungen haben möglicherweise eine andere Standardkomprimierungsstufe (Kompromiss zwischen gespeicherter CPU-Zeit und gespeicherter Größe) oder nur einen anderen Code, der mehr oder weniger Übereinstimmungen speichert und mehr oder weniger Bytes auf der Standardkomprimierungsstufe speichert.

Beispielsweise erstellt 7-Zip normalerweise kleinere .zipDateien als andere ZIP-Programme. (Und nein, ich spreche nicht über ein eigenes .7zDateiformat. Es hat auch einen besseren reinen ZIP-Kompressor.)

zipcmp ist ein cmdline-Programm, das ZIP-Dateien vergleichen kann. Standardmäßig wird nur das ZIP-Verzeichnis verglichen, um sicherzustellen, dass alle Dateien denselben Namen, dieselbe Größe und dieselbe CRC haben . In diesem Fall haben beide ZIP-Dateien mit ziemlicher Sicherheit den gleichen Inhalt, werden jedoch unterschiedlich komprimiert (wenn die komprimierte Größe unterschiedlich ist). Solange die ZIP-Dateien nicht beschädigt sind, ist dies selbstverständlich. Verwenden Sie unzip -t foo.zipeine ZIP - Datei zum Dekomprimierungsfehlern zu testen, nicht passenden CRCs usw.

Peter Cordes
quelle
Würden die __MACOSX-Ordner die CRC-Berechnung nicht beeinflussen?
Kent
1
ZIP speichert in einer separaten CRC den unkomprimierten Inhalt jeder komprimierten Datei. (Also nein, aus zwei Gründen: Verzeichnisse enthalten nur andere Dateien, keinen eigenen Datenblock. Und zwei, die in den ZIP-Metadaten gespeicherten CRCs gelten für jede Datei separat.) Also alle Dateien, die gleich waren Zwei ZIP-Dateien stimmen in CRC und dekomprimierter Größe überein.
Peter Cordes
@PeterCordes Die Tatsache, dass verschiedene ZIP-Implementierungen unterschiedliche Dateigrößen erzeugen können, hat genau meine Aufmerksamkeit erregt. Ich wusste, dass die Shell "/ usr / bin / zip" ausführte. Aber da Finder mir eine andere Dateigröße gab, dachte ich, Finder verwendete eine völlig andere ausführbare Datei (und das war für mich ärgerlich). Wenn ich wüsste, wie man Roots erstellt, und etwas Mut hätte, würde ich als Test "/ usr / bin / zip" nach "/ tmp" verschieben und dann eine Finder-Zip-Datei ausprobieren (und besser einen Fehler ausgeben). Aber ich habe noch viel zu tun und kann es nicht riskieren, meinen Mac zu destabilisieren!
David
Der sicherste Weg, vorübergehend durch /usr/bin/zipeine andere Version zu ersetzen, wäre ln /usr/bin/zip /usr/bin/zip.standard; mv new_zip /usr/bin/zip. Auf diese Weise haben Sie immer eine /usr/bin/zip, weil Sie die Systemimplementierung atomar ersetzen. Außerdem wird die alte Version nur umbenannt und nicht verschoben /tmp(möglicherweise auf einem anderen Dateisystem). Um sie zu deaktivieren, benenne ich sie einfach in um und überprüfe zip.disab, ob Finder nicht funktioniert. Benenne sie dann wieder um. Funktionen zur Erstellung von Zip-Bibliotheken sind jedoch weit verbreitet. Finder gibt / exec mit ziemlicher Sicherheit nicht auf /usr/bin/zip.
Peter Cordes
@PeterCordes Ich verstehe, wie man Bibliotheken anstelle der ausführbaren Datei aufruft. Die ausführbare Datei wäre jedoch "/ usr / bin / ditto" und nicht "/ usr / bin / zip". Die Hilfe von diesem Forum ist großartig. Vielen Dank für Ihre Zeit und Mühe.
David