Mac zip komprimieren ohne __MACOSX Ordner?

158

Wenn ich Dateien mit dem in Mac OS X integrierten Zip-Kompressor komprimiere, wird ein zusätzlicher Ordner mit dem Titel "__MACOSX" in der extrahierten Zip-Datei erstellt.

Kann ich meine Einstellungen anpassen, um zu verhindern, dass dieser Ordner erstellt wird, oder muss ich ein Komprimierungstool eines Drittanbieters erwerben?

UPDATE : Ich habe gerade eine Freeware-App für OSX gefunden, die mein Problem löst: " YemuZip "

UPDATE 2 : YemuZip ist keine Freeware mehr

Scott B.
quelle
Das Vorhandensein des Ordners _MACOSX verursacht keine Probleme. Einfach löschen.
Jayprakash Dubey
1
Diese Frage scheint nicht zum Thema zu gehören, da sie in AskDifferent
Nakilon am
11
Es schafft ein Problem mit wählerischen Webdiensten, die ein makelloses Zip-Archiv erfordern, daher bin ich dankbar für die Erklärungen
mccc
21
@JayprakashDubey Es ist incredibily irritierend und als Linux - Benutzer, der nicht verlassen Müll mag , wo ich gehen, ich kann es nicht ertragen __MACOSX, .DS_Store, ._fileName, und all die anderen sortierten turds Mac OS fällt in seinen Archiven. OSXs "Teer" tut dies ebenfalls - unter offensichtlicher Missachtung des Prinzips des geringsten Erstaunens .
Wyatt8740

Antworten:

80

Als ich dieses Problem hatte, habe ich es über die Kommandozeile gemacht:

zip file.zip uncompressed

EDIT , nach vielen downvotes: ich seit einiger Zeit diese Option wurde mit vor und ich weiß nicht , wo ich es gelernt, so kann ich Ihnen nicht eine bessere Erklärung geben. Chris Johnsons Antwort ist richtig, aber ich werde meine nicht löschen. Wie ein Kommentar sagt, ist es genauer, was OP verlangt, da es ohne diese Dateien komprimiert, anstatt sie aus einer komprimierten Datei zu entfernen. Ich finde es auch einfacher, mich zu erinnern.

Sinuhepop
quelle
33
Dies ist nicht erklärbar.
Raptor
2
Das Unterverzeichnis __MACOSX / enthält Mac-Ressourcengabeln und wird erstellt, wenn Sie zum Erstellen der Zip-Datei Mac-Tools verwenden. Ebenso verwenden Mac-Tools das Unterverzeichnis __MACOSX /, um Ressourcengabeln festzulegen, und Sie werden es nie sehen. Wenn Sie jedoch Mac-Tools zum Erstellen der Zip-Datei und einige andere Tools zum Entpacken verwenden, erhalten Sie das Verzeichnis __MACOSX / und nicht die Ressourcengabeln. Wenn Sie die Datei mit erstellen zip, bei der es sich um eine Drittanbieter-App handelt, wird das __MACOSX / -Verzeichnis überhaupt nicht erstellt.
Edward Falk
In meiner Antwort finden Sie eine einfache Möglichkeit, den Ordner _MACOSX nach dem Erstellen der Zip-Datei zu löschen.
Chris Johnson
3
So rekursiv ein Verzeichnis ohne __MACOSX und andere komprimieren:zip -rX file.zip uncompressed_directory
Konstantin Suworow
319

Kann nachträglich durch behoben werden zip -d filename.zip __MACOSX/\*

Chris Johnson
quelle
51
Um auch .DS_Store-Dateien zu löschen:zip -d filename.zip \*/.DS_Store
Benedikt Köppel
5
Die akzeptierte Antwort besagt, dass das Verzeichnis __MACOSX / überhaupt nicht abgerufen werden soll, sagt jedoch nichts darüber aus, was mit einer vorhandenen ZIP-Datei zu tun ist. Diese Antwort sagt, wie Sie __MACOSX / loswerden können, wenn Sie es bereits haben. Die ursprüngliche Frage war jedoch, wie man sie überhaupt nicht bekommt, daher ist die akzeptierte Antwort die richtige.
Edward Falk
Wie kann ich dies rekursiv für alle Zip-Dateien tun?
Wowfunhappy
So wenden Sie auf alle Zip-Dateien unter einem Root an : find ~ -type f -name '*.zip' -exec zip -d '{}' __MACOSX/\* \;. Ersetzen Sie Ihren Ausgangspunkt für ~.
Chris Johnson
Eine Funktion zum Entfernen aller Junk-Dateien : cleanzip(){ zip -d $1 $2 __MACOSX/\* \*/.DS_Store; }. Verwendung: cleanzip file.zipoder cleanzip file.zip MORE_JUNK_FILES(zweiter Parameter ist optional)
mrdaliri
56

Innerhalb des Ordners, den Sie komprimieren möchten, im Terminal:

zip -r -X Archive.zip *

Wobei -X bedeutet: Schließen Sie unsichtbare Mac-Ressourcendateien wie "_MACOSX" oder "._Dateiname" aus und speichern Sie .ds-Dateien

Quelle

Hinweis: Funktioniert nur für den Ordner und den nachfolgenden Ordnerbaum, in dem Sie sich befinden, und muss über den *Platzhalter verfügen .

Pompalini
quelle
9
Dies funktioniert nicht so, wie Sie denken: -XSchließt .DS_Store-Dateien nicht aus. Der Grund, warum es für Ihre Anwendung möglicherweise funktioniert, ist, dass Sie nur komprimieren. Dies *ist ein Platzhalter, der mit Dateien übereinstimmt, die nicht mit "." Beginnen. Probieren Sie es in einem Verzeichnis aus, das eine Punktdatei enthält, und Sie werden sehen, dass es enthalten ist.
Spinup
In meiner Antwort finden Sie eine einfache Möglichkeit, den Ordner _MACOSX nach dem Erstellen der Zip-Datei zu löschen.
Chris Johnson
1
Nein . Tun zip -r -X Archive.zip myfolderauf einem Ordner , führt nach wie vor in einer ZIP - Datei mit .DS_Store Datei.
Rockallite
@Rockallite: Sie haben Recht, dies funktioniert nur, wenn Sie die Ordner, den Baum oder die Dateien in dem Ordner, in dem Sie sich befinden, komprimieren. Daher können Sie einen Ordner nicht als Argument übergeben oder es funktioniert nicht wie erwartet, nur mit dem Platzhalter * es funktioniert.
Pompalini
Dies funktioniert für Dateien in Verzeichnissen, anstatt einen vollständigen Ordner zu komprimieren.
Michael Trouw
26

Dieser Befehl hat es für mich getan:

zip -r Target.zip Source -x "*.DS_Store"

Target.zipist die zu erstellende Zip-Datei. Sourceist die Quelldatei / der Quellordner zum Komprimieren. Und der _xParameter gibt die Datei / den Ordner an, die bzw. der nicht eingeschlossen werden soll. Wenn das oben genannte aus irgendeinem Grund nicht funktioniert, versuchen Sie stattdessen Folgendes:

zip -r Target.zip Source -x "*.DS_Store" -x "__MACOSX"
Adil Hussain
quelle
Das OP fragte, wie der Ordner __MACOSX ausgeschlossen werden soll. Ihr erstes Code-Snippet funktioniert offensichtlich nicht, da es nicht als auszuschließender Ordner bezeichnet wird.
Chris Johnson
7
Das zipBefehlszeilenprogramm erstellt niemals ein __MACOSXVerzeichnis, sodass das erste Snippet funktioniert und das -x "__MACOSX"Teil nicht benötigt wird.
Nisetama
15

Ich verwende dieses Automator-Shell-Skript, um es danach zu beheben. Es wird als Kontextmenüelement angezeigt (Rechtsklick auf eine Datei, die im Finder angezeigt wird).

while read -r p; do
  zip -d "$p" __MACOSX/\* || true
  zip -d "$p" \*/.DS_Store || true
done
  1. Erstellen Sie mit Automator einen neuen Service
  2. Wählen Sie "Dateien und Ordner" im "Finder"
  3. Fügen Sie eine "Shell-Skript-Aktion" hinzu

Automator-Shell-Skript

Kontextmenüpunkt im Finder

benedikt
quelle
Wäre es nicht besser, die Komprimierung mit zip im Automator Shell-Skript durchzuführen, als mit Apple zu komprimieren und dann unerwünschte Dateien zu entfernen?
Matt
@Matt Sie können den Archivierungsschritt im Automator hinzufügen oder auch einen anderen Shell-Befehl verwenden.
ttimasdf
@Matt außerdem übernimmt Apple die automatische Benennung von Dateien und die Namenserhöhung, wenn eine Datei vorhanden ist. Mit Shell-Skript wäre dieser Teil eine Menge Arbeit.
ttimasdf
1
Es wird ein Fehler ausgegeben, wenn der Ordner .DS_Store nicht im Archiv vorhanden ist. Ich schlage eine Verbesserung vor, indem ich `|| hinzufüge true` nach jedem Zip-Befehl (z. B. zip -d "$p" __MACOSX/\* || truein Ihre Antwort.
Adamsfamily
1
Während die anderen Antworten gut sind, gefällt mir diese am besten, weil sie sehr mazisch verwendet werden kann.
not2savvy
10

Die unerwünschten Ordner können auch folgendermaßen gelöscht werden:

zip -d filename.zip "__MACOSX*"

Funktioniert am besten für mich

SabU
quelle
8
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX": Ignorieren Sie __MACOSX, wie Sie erwähnen.
  • -x "*/\.*": Ignorieren Sie alle versteckten Dateien, z. B. .DS_Store.
  • Zitieren Sie die Variable, um eine Datei zu vermeiden, wenn sie mit SPACE benannt ist.

Sie können auch einen Automator-Service erstellen, um die Verwendung im Finder zu vereinfachen. Überprüfen Sie den Link unten, um Details zu sehen, wenn Sie brauchen.

Github

Jian Jason
quelle
Heh, die einzig richtige Antwort unter einem Meer von Müll, ist auch die mit den wenigsten Stimmen. / Seufzer
Heath Raftery
Es hat bei mir funktioniert, aber ich musste die Anführungszeichen und das Dollarsymbol vor destFileName.zip und srcFileName
Alexander Poleschuk
3

Das zipBefehlszeilenprogramm erstellt niemals ein __MACOSXVerzeichnis. Sie können also einfach einen Befehl wie den folgenden ausführen:

zip directory.zip -x \*.DS_Store -r directory

In der folgenden Ausgabe enthält a.zipdie mit dem zipBefehlszeilenprogramm erstellte Ausgabe kein __MACOSXVerzeichnis, a 2.zipdie ich jedoch mit dem Finder erstellt habe.

$ touch a
$ xattr -w somekey somevalue a
$ zip a.zip a
  adding: a (stored 0%)
$ unzip -l a.zip
Archive:  a.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  01-02-16 20:29   a
 --------                   -------
        0                   1 file
$ unzip -l a\ 2.zip # I created `a 2.zip` from Finder before this
Archive:  a 2.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  01-02-16 20:29   a
        0  01-02-16 20:31   __MACOSX/
      149  01-02-16 20:29   __MACOSX/._a
 --------                   -------
      149                   3 files

-x .DS_Storeschließt .DS_StoreDateien in Verzeichnissen nicht aus , -x \*.DS_Storetut es aber .

Die Datei der obersten Ebene eines Zip-Archivs mit mehreren Dateien sollte normalerweise ein einzelnes Verzeichnis sein, da andere nicht archivierende Dienstprogramme (wie unzipund 7z, aber nicht das Archivierungsdienstprogramm, The Unarchiver unar, oder) vorhanden sinddtrx ) kein enthaltendes Verzeichnis für das Verzeichnis erstellen Dateien, wenn das Archiv extrahiert wird, was häufig das Auffinden der Dateien erschwert. Wenn mehrere solcher Archive gleichzeitig extrahiert werden, kann es schwierig sein, festzustellen, welche Dateien zu welchem ​​Archiv gehören.

Das Archivierungsdienstprogramm erstellt ein __MACOSXVerzeichnis nur, wenn Sie ein Archiv erstellen, in dem mindestens eine Datei Metadaten wie erweiterte Attribute, Dateiflaggen oder einen Ressourcengabel enthält. Das __MACOSXVerzeichnis enthält AppleDouble-Dateien, deren Dateiname damit beginnt und ._die zum Speichern von OS X-spezifischen Metadaten verwendet werden. Das zipBefehlszeilenprogramm verwirft Metadaten wie erweiterte Attribute, Dateiflaggen und Ressourcengabeln. Dies bedeutet auch, dass Metadaten wie Tags verloren gehen und Aliase nicht mehr funktionieren, da die Informationen in einer Aliasdatei in einer Ressourcengabel gespeichert sind.

Normalerweise können Sie die OS X-spezifischen Metadaten einfach verwerfen, aber um zu sehen, was Metadatendateien enthalten, können Sie sie verwenden xattr -l. xattrEnthält auch Ressourcengabeln und Dateiflaggen, da auf sie über die Schnittstelle für erweiterte Attribute zugegriffen werden kann, obwohl sie nicht als erweiterte Attribute gespeichert sind. Sowohl das Archivierungsdienstprogramm als auch das zipBefehlszeilenprogramm verwerfen ACLs.

Nisetama
quelle
Dies funktioniert nur für Verzeichnisse, nicht für eine Reihe von Dateien in einem Verzeichnis.
Michael Trouw
@MichaelTrouw Ja, aber normalerweise sollten Sie in erster Linie kein Archiv erstellen, das mehrere Dateien auf der obersten Ebene enthält.
Nisetama
Ich bin damit einverstanden, nicht zuzustimmen, da es Anwendungsfälle gibt, in denen dies in Ordnung ist. Zum Beispiel eine, bei der der Endbenutzer einer Zip-Datei niemals ein Benutzer sein wird. Aber ein Server.
Michael Trouw
3

Das kannst du nicht.

Sie können diese unerwünschten Ordner jedoch nach dem Zippen löschen. Die Befehlszeile verwendet zipverschiedene Argumente, wobei eines -dzum Löschen von Inhalten basierend auf einem regulären Ausdruck dient. Sie können es also folgendermaßen verwenden:

zip -d filename.zip __MACOSX/\*
Alejandro Pablo Tkachuk
quelle
2

komprimiere keine versteckte Datei:

zip newzipname filename.any  -x "\.*"

mit dieser Frage sollte es sein wie:

zip newzipname filename.any  -x "\__MACOSX"

Es muss jedoch gesagt werden, dass der Befehl zip im Terminal ausgeführt wird, indem nur die Datei komprimiert wird, keine anderen komprimiert werden. Tun Sie dies, das Ergebnis ist das gleiche:

zip newzipname filename.any
Xian Shu
quelle
__MACOSXbeginnt nicht mit.
PJMeisch
Ja, ich habe einen Fehler gemacht. Es wurde geändert. Danke, dass du mich daran erinnert hast
Xian Shu
1

Meinen Sie das zipBefehlszeilentool oder den Finder-Komprimierungsbefehl?

Für zipkönnen Sie die --data-forkOption ausprobieren . Wenn dies nicht der Fall ist, können Sie es versuchen --no-extra, obwohl dies andere wertvolle Dateimetadaten wie uid / gid und Dateizeiten zu ignorieren scheint.

Für den Komprimierungsbefehl des Finders glaube ich nicht, dass es Optionen gibt, um sein Verhalten zu steuern. Es ist für den einfachen Fall.

Das andere Werkzeug und vielleicht das, das der Finder tatsächlich unter der Haube verwendet, ist ditto. Mit den -c -kOptionen werden Zip-Archive erstellt. Mit diesem Tool können Sie experimentieren mit --norsrc, --noextattr, --noqtn, --noaclund / oder einfach die wegzulassen --sequesterRsrcOption (die nach der Manpage kann für das verantwortlich sein __MACOSXUnterverzeichnis). Obwohl das Fehlen von --sequesterRsrceinfach bedeutet, das AppleDouble-Format zu verwenden, das überall ._ Dateien anstelle eines __MACOSXVerzeichnisses erstellen würde .

Ken Thomases
quelle
1
Ja, ich beziehe mich auf das Dienstprogramm "Compress" des Finders. So wie es ist, bekomme ich einen Ordner voller ._-Dateien, der das Erscheinungsbild / den Editor von WordPress durcheinander bringt
Scott B
1

Ich habe eine bessere Lösung, nachdem ich alle vorhandenen Antworten gelesen habe. Alles kann durch einen Workflow mit einem einzigen Rechtsklick erledigt werden. KEINE zusätzliche Software, KEINE komplizierten Kommandozeilen und KEINE Shell-Tricks.

Der Automator-Workflow:

  • Eingabe: Dateien oder Ordner aus einer beliebigen Anwendung.
  • Schritt 1: Archiv erstellen, das System mit Standardparametern.
  • Schritt 2: Führen Sie den Shell-Befehl mit der Eingabe als Parameter aus. Kopierbefehl unten.

    zip -d "$@" "__MACOSX/*" || true

    zip -d "$@" "*/.DS_Store" || true

Speichern Sie es und wir sind fertig! Klicken Sie einfach mit der rechten Maustaste auf den Ordner oder einen Großteil der Dateien und wählen Sie den Workflow aus dem Menü "Dienste". Nebenbei wird ein Archiv ohne Metadaten erstellt.

Stichprobe

ttimasdf
quelle
0

So vermeide ich das __MACOSXVerzeichnis, wenn ich Dateien mit dem tarBefehl komprimiere :

$ cd dir-you-want-to-archive $ find . | xargs xattr -l # <- list all files with special xattr attributes ... ./conf/clamav: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55 ./conf/global: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55 ./conf/web_server: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55

Löschen Sie zuerst das Attribut:

find . | xargs xattr -d com.apple.quarantine

Führen Sie find . | xargs xattr -lerneut aus, und stellen Sie sicher, dass keine Datei das Attribut xattr hat. dann können Sie loslegen:

tar cjvf file.tar.bz2 dir

Zhang Huangbin
quelle