Comprimi zip Mac senza cartella __MACOSX?


158

Quando comprimo i file con il compressore zip incorporato in Mac OSX, si ottiene una cartella aggiuntiva denominata "__MACOSX" creata nella zip estratta.

Posso modificare le mie impostazioni per impedire la creazione di questa cartella o devo acquistare uno strumento di compressione di terze parti?

AGGIORNAMENTO : Ho appena trovato un'app freeware per OSX che risolve il mio problema: " YemuZip "

AGGIORNAMENTO 2 : YemuZip non è più freeware


L'esistenza della cartella _MACOSX non crea alcun problema. Basta cancellarlo.
Jayprakash Dubey,

1
Questa domanda sembra fuori tema perché dovrebbe essere in AskDifferent
Nakilon,

11
Crea un problema con i servizi Web esigenti che richiedono un archivio zip incontaminato, quindi sono grato per le spiegazioni
mccc

21
@JayprakashDubey E 'incredibily irritante, e come un utente Linux che ama non lasciando spazzatura ovunque io vada, non riesco a stare in piedi __MACOSX, .DS_Store, ._fileName, e tutti gli altri stronzi assortiti Mac OS scende nei suoi archivi. Anche il `tar 'di OSX fa questo - in palese disprezzo per il principio del minimo stupore .
Wyatt8740,

Risposte:


80

Quando ho avuto questo problema l'ho fatto dalla riga di comando:

zip file.zip uncompressed

MODIFICA , dopo molti commenti negativi: stavo usando questa opzione da qualche tempo e non so dove l'ho imparata, quindi non posso darti una spiegazione migliore. La risposta di Chris Johnson è corretta, ma non eliminerò la mia. Come dice un commento, è più preciso a ciò che OP richiede, poiché comprime senza quei file, invece di rimuoverli da un file compresso. Trovo anche più facile da ricordare.


33
Questo manca di spiegazione.
Raptor,

2
La sottodirectory __MACOSX / contiene fork di risorse Mac e viene creata quando si utilizzano gli strumenti Mac per creare il file zip. Allo stesso modo, gli strumenti Mac consumeranno la sottodirectory __MACOSX / per impostare le fork di risorse e non la vedrai nemmeno. Tuttavia, se usi gli strumenti Mac per creare il file zip e alcuni altri strumenti per decomprimerlo, otterrai la directory __MACOSX / e non i fork di risorse. Se si crea il file con zip, che è un'app di terze parti, la directory __MACOSX / non viene mai creata in primo luogo.
Edward Falk,

Vedi la mia risposta per un modo semplice per eliminare la cartella _MACOSX dopo aver creato il file zip.
Chris Johnson,

3
Per comprimere ricorsivamente una directory senza __MACOSX e altri:zip -rX file.zip uncompressed_directory
Konstantin Suvorov

319

Può essere risolto dopo il fatto da zip -d filename.zip __MACOSX/\*


51
per eliminare anche i file .DS_Store:zip -d filename.zip \*/.DS_Store
Benedikt Köppel,

5
La risposta accettata dice come non ottenere la directory __MACOSX / in primo luogo, ma non dice nulla su cosa fare con un file .zip esistente. Questa risposta dice come sbarazzarsi di __MACOSX / se l'hai già ottenuto. Tuttavia, la domanda originale era come non ottenerla in primo luogo, quindi la risposta accettata è quella corretta.
Edward Falk,

Come potrei farlo in modo ricorsivo per tutti i file zip?
Wowfunhappy,

Per applicare a tutti i file zip sotto qualche radice: find ~ -type f -name '*.zip' -exec zip -d '{}' __MACOSX/\* \;. Sostituisci il tuo punto di partenza per ~.
Chris Johnson,

Una funzione per rimuovere tutti i file spazzatura: cleanzip(){ zip -d $1 $2 __MACOSX/\* \*/.DS_Store; }. Utilizzo: cleanzip file.zipoppure cleanzip file.zip MORE_JUNK_FILES(il secondo parametro è facoltativo)
mrdaliri

56

All'interno della cartella che vuoi comprimere, nel terminale:

zip -r -X Archive.zip *

Dove -X significa: escludere quei file di risorse Mac invisibili come "_MACOSX" o "._Filename" e .ds archiviano i file

fonte

Nota: funzionerà solo per la cartella e il successivo albero delle cartelle in cui ci si trova e deve avere il *carattere jolly.


9
Questo non funziona come pensi: -Xnon esclude i file .DS_Store. Il motivo per cui potrebbe funzionare per la tua applicazione è che stai solo zippando *, che è un jolly che corrisponde a file che non iniziano con ".". Provalo su una directory contenente un file-punto e vedrai che viene incluso.
spinup

Vedi la mia risposta per un modo semplice per eliminare la cartella _MACOSX dopo aver creato il file zip.
Chris Johnson,

1
No. Fare zip -r -X Archive.zip myfoldersu una cartella comporta comunque un file zip contenente il file .DS_Store.
Rockallite,

@Rockallite: hai ragione, funzionerà solo quando comprimi le cartelle, l'albero o i file nella cartella in cui ti trovi. Quindi non puoi passare una cartella come argomento o non funzionerà come previsto, solo con il carattere jolly * funzionerà funziona.
pompalini,

Funziona con i file all'interno delle directory, anziché zippare una cartella completa.
Michael Trouw,

26

Questo comando l'ha fatto per me:

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

Target.zipè il file zip da creare. Sourceè il file / cartella di origine da comprimere. E il _xparametro specifica il file / la cartella da non includere. Se quanto sopra non funziona per qualsiasi motivo, prova invece questo:

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

L'OP ha chiesto come escludere la cartella __MACOSX. Ovviamente il tuo primo frammento di codice non funziona, perché non lo definisce come una cartella da escludere.
Chris Johnson,

7
L' ziputilità della riga di comando non crea mai una __MACOSXdirectory, quindi il primo frammento funziona e la -x "__MACOSX"parte non è necessaria.
nisetama,

15

Sto usando questo Automator Shell Script per ripararlo dopo. Viene visualizzato come voce di menu contestuale (facendo clic con il tasto destro su qualsiasi file visualizzato nel Finder).

while read -r p; do
  zip -d "$p" __MACOSX/\* || true
  zip -d "$p" \*/.DS_Store || true
done
  1. Crea un nuovo servizio con Automator
  2. Seleziona "File e cartelle" in "Finder"
  3. Aggiungi "Azione script shell"

script shell automator

voce di menu contestuale nel Finder


Non sarebbe meglio fare la compressione usando zip in Automator Shell Script, piuttosto che comprimere usando Apple integrato, quindi rimuovere i file indesiderati?
Matt

@Matt è possibile aggiungere la fase di archiviazione in automator o utilizzare anche un altro comando shell.
ttimasdf,

@Matt inoltre, Apple incorporato gestisce la denominazione automatica dei file e l'incremento del nome quando esiste il file. Con shell script questa parte sarebbe molto impegnativa.
ttimasdf,

1
Genera un errore se la cartella .DS_Store non è presente nell'archivio. Suggerisco un miglioramento aggiungendo `|| true` dopo ogni comando zip (come zip -d "$p" __MACOSX/\* || truenella tua risposta.
Adamsfamily,

1
Mentre le altre risposte sono buone, questa mi piace di più perché può essere usata in modo molto macish.
not2savvy,

10

Le cartelle indesiderate possono anche essere eliminate nel modo seguente:

zip -d filename.zip "__MACOSX*"

Funziona meglio per me


8
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX": ignora __MACOSX come dici.
  • -x "*/\.*": ignora qualsiasi file nascosto, come .DS_Store.
  • Cita la variabile per evitare il file se è chiamato con SPACE.

Inoltre, puoi creare il servizio Automator per renderlo facilmente utilizzabile nel Finder. Controlla il link qui sotto per vedere i dettagli se necessario.

Github


Heh, l'unica risposta corretta in un mare di immondizia, è anche quella con il minor numero di voti. / sospiro
Heath Raftery,

Ha funzionato per me, ma ho dovuto rimuovere le virgolette e il simbolo del dollaro prima di destFileName.zip e srcFileName
Alexander Poleschuk

3

L' ziputilità della riga di comando non crea mai una __MACOSXdirectory, quindi puoi semplicemente eseguire un comando come questo:

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

Nell'output seguente, a.zipche ho creato con l' ziputilità della riga di comando non contiene una __MACOSXdirectory, ma a 2.zipche ho creato dal Finder.

$ 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_Storenon esclude i .DS_Storefile all'interno delle directory ma lo -x \*.DS_Storefa.

Il file di livello superiore di un archivio zip con più file dovrebbe in genere essere una singola directory, perché in caso contrario, alcuni programmi di utilità di archiviazione (come unzipe 7z, ma non l'utilità di archiviazione, The Unarchiver unaro dtrx) non creano una directory di contenimento per il file quando viene estratto l'archivio, il che rende spesso difficili da trovare i file, e se più archivi come quello vengono estratti contemporaneamente, può essere difficile dire quali file appartengono a quale archivio.

L'utilità di archiviazione crea una __MACOSXdirectory solo quando si crea un archivio in cui almeno un file contiene metadati come attributi estesi, flag di file o fork di risorse. La __MACOSXdirectory contiene file AppleDouble il cui nome inizia con ._quello utilizzato per memorizzare metadati specifici di OS X. L' ziputilità della riga di comando ignora metadati come attributi estesi, flag di file e fork di risorse, il che significa anche che i metadati come i tag vengono persi e che gli alias smettono di funzionare, poiché le informazioni in un file alias vengono archiviate in un fork di risorse.

Normalmente puoi semplicemente scartare i metadati specifici di OS X, ma per vedere cosa contengono i file di metadati, puoi usarli xattr -l. xattrinclude anche fork di risorse e flag di file, perché anche se non sono effettivamente archiviati come attributi estesi, è possibile accedervi tramite l'interfaccia degli attributi estesi. Sia l'utilità di archiviazione che l'utilità della zipriga di comando eliminano gli ACL.


Questo funziona solo per le directory, non per un mucchio di file all'interno di una directory.
Michael Trouw,

@MichaelTrouw Sì, ma di solito non dovresti creare un archivio che contenga più file al primo livello.
nisetama,

Sono d'accordo di non essere d'accordo perché ci sono casi d'uso in cui questo va bene. Ad esempio, uno in cui l'utente finale di un file zip non sarà mai un utente. Ma un server.
Michael Trouw,

3

Non puoi.

Ma quello che puoi fare è eliminare quelle cartelle indesiderate dopo averle zippate. La riga di comando zipprende diversi argomenti in cui uno, il -d, è per eliminare i contenuti in base a una regex. Quindi puoi usarlo in questo modo:

zip -d filename.zip __MACOSX/\*

2

non comprimere alcun file nascosto:

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

con questa domanda, dovrebbe essere come:

zip newzipname filename.any  -x "\__MACOSX"

Va detto, tuttavia, il comando zip viene eseguito nel terminale solo comprimendo il file, non comprime nessun altro. Quindi fai questo il risultato è lo stesso:

zip newzipname filename.any

__MACOSXnon inizia con.
PJMeisch

sì, ho fatto un errore. È stato modificato Grazie per avermelo ricordato
Xian Shu,

1

Intendi lo zipstrumento da riga di comando o il comando Comprimi del Finder?

Per zip, puoi provare l' --data-forkopzione. In caso contrario, potresti provare --no-extra, anche se sembra ignorare altri metadati di file che potrebbero essere utili, come uid / gid e i tempi dei file.

Per il comando Comprimere del Finder, non credo che ci siano opzioni per controllarne il comportamento. È per il semplice caso.

L'altro strumento, e forse quello che il Finder utilizza effettivamente sotto il cofano, è ditto. Con le -c -kopzioni, crea archivi zip. Con questo strumento, si può sperimentare con --norsrc, --noextattr, --noqtn, --noacle / o semplicemente lasciare fuori l' --sequesterRsrcopzione (che, secondo la pagina man, può essere responsabile per la __MACOSXsottodirectory). Anche se, forse, l'assenza di --sequesterRsrcmezzi significa semplicemente utilizzare il formato AppleDouble, che creerebbe file ._ ovunque anziché una __MACOSXdirectory.


1
Sì, mi riferisco all'utilità "Compress" del Finder. Così com'è, sto ottenendo una cartella piena di file ._ che rovina l'aspetto / editor di WordPress
Scott B

1

Ho una soluzione migliore dopo aver letto tutte le risposte esistenti. Tutto potrebbe essere eseguito da un flusso di lavoro con un solo clic destro. NESSUN software aggiuntivo, NESSUNA complicata riga di comando e NESSUN trucco della shell.

Il flusso di lavoro dell'automatore:

  • Input: file o cartelle da qualsiasi applicazione.
  • Step 1: Crea Archive, il sistema integrato con parametri predefiniti.
  • Passaggio 2: eseguire il comando Shell, con input come parametri. Copia il comando qui sotto.

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

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

Salvalo e abbiamo finito! Basta fare clic con il pulsante destro del mouse sulla cartella o sulla maggior parte dei file e scegliere il flusso di lavoro dal menu dei servizi. L'archivio senza metadati verrà creato a fianco.

Campione


0

Ecco come evito la __MACOSXdirectory quando comprimo i file con il tarcomando:

$ 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

Elimina prima l'attributo:

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

Esegui di find . | xargs xattr -lnuovo, assicurati che nessun file abbia l'attributo xattr. allora sei a posto:

tar cjvf file.tar.bz2 dir

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.