2012-06-07 2 views
113

Lorsque je compresser des fichiers avec le compresseur zip intégré dans Mac OSX, il en résulte un dossier supplémentaire intitulé "__MACOSX" créé dans le zip extrait. Puis-je modifier mes paramètres pour empêcher la création de ce dossier ou dois-je acheter un outil de compression tiers?Mac compresser zip sans dossier __MACOSX?

MISE À JOUR: Je viens de trouver une application freeware pour Mac OS X qui permet de résoudre mon problème: « YemuZip »

+0

L'existence du dossier _MACOSX ne crée pas de problème. Il suffit de le supprimer. –

+1

Cette question semble être hors-sujet car il devrait être dans AskDifferent – Nakilon

+8

Il crée un problème avec les services web difficiles qui nécessitent une archive zip vierge, donc je suis reconnaissant pour les explications – mccc

Répondre

50

Quand j'ai eu ce problème, je l'ai fait de la ligne de commande:

zip file.zip uncompressed

EDIT, après plusieurs downvotes: j'utilisais il y a cette option pendant un certain temps et je ne sais pas où je l'ai appris, donc je ne peux pas vous donner une meilleure explication. Chris answer de Chris Johnson est correct, mais je ne vais pas supprimer le mien. Comme l'indique un commentaire, il est plus précis que ce que demande OP, car il compresse sans ces fichiers, au lieu de les supprimer d'un fichier compressé. Je trouve aussi plus facile de m'en souvenir.

+30

Cela manque d'explication. – Raptor

+0

Le sous-répertoire __MACOSX/contient des forks de ressources Mac et est créé lorsque vous utilisez des outils Mac pour créer le fichier zip. De même, les outils Mac vont consommer le sous-répertoire __MACOSX/afin de définir des forks de ressources, et vous ne le verrez jamais. Toutefois, si vous utilisez des outils Mac pour créer le fichier zip et d'autres outils pour le décompresser, vous obtiendrez le répertoire __MACOSX/et non les forks de ressources. Si vous créez le fichier avec 'zip', qui est une application tierce, le répertoire __MACOSX/ne sera jamais créé en premier lieu. –

+0

Voir ma réponse pour un moyen facile de supprimer le dossier _MACOSX après la création du fichier zip. –

1

Voulez-vous dire l'outil de ligne de commande zip ou la commande Compress Finder? Pour zip, vous pouvez essayer l'option --data-fork. Si cela ne fonctionne pas, vous pouvez essayer --no-extra, bien que cela semble ignorer les autres métadonnées de fichiers qui pourraient être utiles, comme les temps d'uid/gid et de fichier.

Pour la commande de compression du Finder, je ne crois pas qu'il existe d'options pour contrôler son comportement. C'est pour le cas simple.

L'autre outil, et peut-être celui que le Finder utilise réellement sous le capot, est ditto. Avec les options -c -k, il crée des archives zip. Avec cet outil, vous pouvez expérimenter avec --norsrc, --noextattr, --noqtn, --noacl et/ou laisser simplement l'option --sequesterRsrc (qui, selon la page de manuel, peut être responsable du sous-répertoire __MACOSX). Bien que, peut-être l'absence de --sequesterRsrc signifie simplement utiliser le format AppleDouble, qui créerait des fichiers ._ partout dans le lieu d'un répertoire __MACOSX.

+1

Oui, je fais référence à l'utilitaire "Compress" du Finder. Comme c'est, je reçois un dossier plein de fichiers ._ qui vis jusqu'à l'apparence de WordPress/éditeur –

231

peut être fixé après le fait par zip -d filename.zip __MACOSX/\*

+28

pour supprimer également les fichiers .DS_Store:' zip -d filename.zip \ * /. DS_Store' –

+5

Cela devrait vraiment être la réponse acceptée. – jschrab

+3

La réponse acceptée indique comment ne pas obtenir le répertoire __MACOSX/en premier lieu, mais ne dit rien sur ce qu'il faut faire avec un fichier .zip existant. Cette réponse indique comment se débarrasser de __MACOSX/si vous l'avez déjà. Cependant, la question initiale était de savoir comment ne pas l'obtenir en premier lieu, de sorte que la réponse acceptée est la bonne. –

17

Cette commande a fait pour moi:

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

Target.zip est le fichier zip pour créer. Source est le fichier/dossier source à compresser. Et le paramètre _x spécifie le fichier/dossier à ne pas inclure. Si ce qui précède ne fonctionne pas pour une raison quelconque, essayez ceci:

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

L'OP a demandé comment exclure le dossier __MACOSX. Votre premier extrait de code ne fonctionne évidemment pas, car il ne le nomme pas en tant que dossier à exclure. –

+7

L'utilitaire de ligne de commande 'zip 'ne crée jamais de répertoire' __MACOSX', donc le premier extrait fonctionne et la partie '-x" __MACOSX "' n'est pas nécessaire. – user4669748

34

Ok après un séjour sur moi-même trouvé cette solution, du terminal:

zip -r -X Archive.zip * 

Où signifie -X: Exclure les fichiers de ressources Mac invisibles tels que "_MACOSX" ou "._Filename" et.stocker des fichiers ds

source

+8

Cela ne fonctionne pas comme vous le pensez: '-X' n'exclut pas les fichiers .DS_Store. La raison pour laquelle cela peut fonctionner pour votre application est que vous zippez seulement '*', qui est un caractère générique correspondant à des fichiers qui ne commencent pas par ".". Essayez-le sur un répertoire contenant un fichier de points, et vous verrez qu'il est inclus. – spinup

+0

Voir ma réponse pour un moyen facile de supprimer le dossier _MACOSX après la création du fichier zip. –

+1

Non. Faire zip -r -X Archive.zip myfolder' sur un dossier entraîne toujours un fichier zip contenant le fichier .DS_Store. – Rockallite

3

L'utilitaire de ligne de commande zip crée jamais un répertoire __MACOSX, de sorte que vous pouvez simplement exécuter une commande comme ceci:

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

Dans la sortie ci-dessous, a.zip que je créé avec l'utilitaire de ligne de commande zip ne contient pas un répertoire __MACOSX, mais a 2.zip que j'ai créé à partir de 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_Store n'exclut pas .DS_Store fichiers dans des répertoires mais -x \*.DS_Store fait.

Le fichier de niveau supérieur d'une archive zip avec plusieurs fichiers doivent généralement être un seul répertoire, parce que si ce n'est pas, certains désarchivage utilites (comme unzip et 7z, mais pas l'utilitaire Archive, The Unarchiver, unar ou dtrx) ne créez pas de répertoire contenant pour les fichiers lorsque l'archive est extraite, ce qui rend souvent les fichiers difficiles à trouver, et si plusieurs archives de ce type sont extraites en même temps, il peut être difficile de dire quels fichiers appartiennent à quelle archive. Archive Utility crée uniquement un répertoire __MACOSX lorsque vous créez une archive dans laquelle au moins un fichier contient des métadonnées telles que des attributs étendus, des indicateurs de fichier ou une branche de ressources. Le répertoire __MACOSX contient des fichiers AppleDouble dont le nom de fichier commence par ._ et qui sont utilisés pour stocker les métadonnées spécifiques à OS X. L'utilitaire de ligne de commande zip rejette les métadonnées telles que les attributs étendus, les indicateurs de fichiers et les ressources, ce qui signifie que les métadonnées telles que les balises sont perdues et que les alias cessent de fonctionner.

Normalement, vous pouvez simplement ignorer les métadonnées spécifiques à OS X, mais pour voir ce que contiennent les fichiers de métadonnées, vous pouvez utiliser xattr -l. xattr inclut également des forks de ressources et des indicateurs de fichiers, car même s'ils ne sont pas réellement stockés en tant qu'attributs étendus, ils peuvent être accessibles via l'interface d'attributs étendus. L'utilitaire d'archivage et l'utilitaire de ligne de commande zip suppriment les ACL.

+0

Cela ne fonctionne que pour les répertoires, pas pour un tas de fichiers dans un répertoire. –

+0

@MichaelTrouw Oui, mais vous ne devriez généralement pas créer une archive contenant plusieurs fichiers au plus haut niveau en premier lieu. – user4669748

+0

Je suis d'accord pour ne pas être d'accord, car il y a des cas d'utilisation où cela convient.Par exemple, celui dans lequel l'utilisateur final d'un fichier zip ne sera jamais un utilisateur. Mais un serveur. –

0

Vous ne pouvez pas. Mais ce que vous pouvez faire est de supprimer ces dossiers indésirables après zipping. La ligne de commande zip prend différents arguments où l'un, le -d, sert à supprimer du contenu basé sur une regex. Ainsi, vous pouvez l'utiliser comme ceci:

zip -d filename.zip __MACOSX/\* 
5

Les dossiers indésirables peuvent également être supprimés par la manière suivante:

zip -d filename.zip "__MACOSX*" 

Works meilleur pour moi

8

J'utilise ce Automator Shell Script pour le réparer après. Apparaît comme élément de menu contextuel (clic droit sur un fichier apparaissant dans le Finder).

while read -r p; do 
    zip -d "$p" __MACOSX/\* || true 
    zip -d "$p" \*/.DS_Store || true 
done 
  1. Créer un nouveau service avec Automator
  2. Sélectionnez "Fichiers et dossiers" dans "Finder"
  3. Ajouter une "action Shell Script"

automator shell script

contextual menu item in Finder

+0

Ne serait-il pas préférable de faire la compression en utilisant le zip dans Automator Shell Script, plutôt que de compresser en utilisant Apple intégré, puis supprimer les fichiers indésirables? – Matt

+0

@Matt vous pouvez ajouter l'étape d'archivage dans automator ou utiliser une autre commande shell. – ttimasdf

+0

@Matt également, Apple intégré gère le nommage automatique des fichiers et l'incrémentation de nom lorsque le fichier existe. Avec le script shell cette partie serait beaucoup de travail. – ttimasdf

1

ne zip aucun fichier caché:

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

cette question, il devrait être comme:

zip newzipname filename.any -x "\__MACOSX" 

Il faut dire, cependant, commande zip fonctionne dans le terminal vient compresser le fichier, il ne ne pas en comprimer d'autres. Alors faites ceci le résultat est le même:

zip newzipname filename.any 
+0

' __MACOSX 'ne commence pas par' .' ​​ –

+0

ouais, j'ai fait une erreur, elle a été modifiée Merci de me le rappeler –

0

J'ai une meilleure solution après avoir lu toutes les réponses existantes. Tout pourrait être fait par un flux de travail en un seul clic droit. NO logiciel supplémentaire, NO bourrages de ligne de commande compliqués et NO tours de shell.

Le flux Automator:

  • Entrée: fichiers ou dossiers de toute application.
  • Étape 1: Créer une archive, le système intégré avec les paramètres par défaut.
  • Étape 2: Exécuter la commande Shell, avec la saisie en tant que paramètres. Copiez la commande ci-dessous.

    zip -d "[email protected]" "__MACOSX/*" || true

    zip -d "[email protected]" "*/.DS_Store" || true

Enregistrer et nous fait! Faites un clic droit sur le dossier ou la masse des fichiers et choisissez le flux de travail dans le menu des services. Les archives sans métadonnées seront créées à côté.

Sample

0

Voilà comment j'éviter le répertoire __MACOSX lorsque des fichiers Compresser avec commande tar:

$ 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

Supprimer l'attribut premier:

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

Run find . | xargs xattr -l à nouveau, assurez-vous qu'aucun fichier n'a l'attribut xattr.alors vous êtes bon pour aller:

tar cjvf file.tar.bz2 dir

Questions connexes