Mac compresser zip sans dossier __MACOSX?

158

Lorsque je compresse 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 ajuster mes paramètres pour empêcher la création de ce dossier ou dois-je acheter un outil de compression tiers?

MISE À JOUR : Je viens de trouver une application gratuite pour OSX qui résout mon problème: " YemuZip "

MISE À JOUR 2 : YemuZip n'est plus un freeware

Scott B
la source
L'existence du dossier _MACOSX ne crée aucun problème. Supprimez-le simplement.
Jayprakash Dubey
1
Cette question semble être hors sujet, car elle devrait être dans AskDifferent
Nakilon
11
Cela 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
21
@JayprakashDubey Il est incredibily irritant, et en tant qu'utilisateur de Linux qui aime ne pas laisser les ordures partout où je vais, je ne peux pas supporter __MACOSX, .DS_Store, ._fileName, et tous les autres Mac OS étrons assortis gouttes dans ses archives. Le `tar 'd'OSX le fait également - au mépris flagrant du principe du moindre étonnement .
Wyatt8740

Réponses:

80

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

zip file.zip uncompressed

EDIT , après de nombreux votes négatifs: j'utilisais cette option il y a quelque temps et je ne sais pas où je l'ai appris, donc je ne peux pas vous donner une meilleure explication. La réponse de Chris Johnson est correcte, mais je ne supprimerai pas la mienne. Comme le dit un commentaire, il est plus précis à ce que demande OP, car il se compresse sans ces fichiers, au lieu de les supprimer d'un fichier compressé. Je trouve aussi plus facile de me souvenir.

sinuhepop
la source
33
Cela manque d'explication.
Raptor
2
Le sous-répertoire __MACOSX / contient des fourchettes de ressources Mac et est créé lorsque vous utilisez les outils Mac pour créer le fichier zip. De même, les outils Mac utiliseront le sous-répertoire __MACOSX / afin de définir des fourchettes de ressources, et vous ne le verrez même jamais. Cependant, 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 fourchettes de ressources. Si vous créez le fichier avec zip, qui est une application tierce, le répertoire __MACOSX / n'est jamais créé en premier lieu.
Edward Falk
Voir ma réponse pour un moyen simple de supprimer le dossier _MACOSX après la création du fichier zip.
Chris Johnson
3
Pour compresser un répertoire récursivement sans __MACOSX et autres:zip -rX file.zip uncompressed_directory
Konstantin Suvorov
319

Peut être réparé après coup par zip -d filename.zip __MACOSX/\*

Chris Johnson
la source
51
pour supprimer également les fichiers .DS_Store:zip -d filename.zip \*/.DS_Store
Benedikt Köppel
5
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 explique 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, donc la réponse acceptée est la bonne.
Edward Falk
Comment puis-je faire cela de manière récursive pour tous les fichiers zip?
Wowfunhappy
Pour appliquer à tous les fichiers zip sous une racine: find ~ -type f -name '*.zip' -exec zip -d '{}' __MACOSX/\* \;. Remplacez votre point de départ par ~.
Chris Johnson
Une fonction pour supprimer tous les fichiers indésirables: cleanzip(){ zip -d $1 $2 __MACOSX/\* \*/.DS_Store; }. Utilisation: cleanzip file.zipou cleanzip file.zip MORE_JUNK_FILES(le deuxième paramètre est facultatif)
mrdaliri
57

Dans le dossier que vous souhaitez compresser, dans le terminal:

zip -r -X Archive.zip *

Où -X signifie: exclut les fichiers de ressources Mac invisibles tels que «_MACOSX» ou «._Filename» et les fichiers de stockage .ds

la source

Remarque: ne fonctionnera que pour le dossier et l'arborescence de dossiers suivante dans laquelle vous vous trouvez et doit avoir le *caractère générique.

pompalini
la source
9
Cela ne fonctionne pas comme vous le pensez: -Xn'exclut pas les fichiers .DS_Store. La raison pour laquelle cela peut fonctionner pour votre application est que vous ne faites que compresser *, ce qui correspond à des fichiers génériques qui ne commencent pas par ".". Essayez-le sur un répertoire contenant un fichier point, et vous verrez qu'il est inclus.
spinup
Voir ma réponse pour un moyen simple de supprimer le dossier _MACOSX après la création du fichier zip.
Chris Johnson
1
Non. Faire zip -r -X Archive.zip myfoldersur un dossier aboutit toujours à un fichier zip contenant le fichier .DS_Store.
Rockallite
@Rockallite: vous avez raison cela ne fonctionnera que lorsque vous compresserez les dossiers, l'arborescence ou les fichiers dans le dossier dans lequel vous vous trouvez. Par conséquent, vous ne pouvez pas passer un dossier en argument ou cela ne fonctionnera pas comme prévu, seul le caractère générique * ça marche.
pompalini
Cela fonctionne pour les fichiers à l'intérieur des répertoires, au lieu de compresser un dossier complet.
Michael Trouw
26

Cette commande l'a fait pour moi:

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

Target.zipest le fichier zip à créer. Sourceest le fichier / dossier source à compresser. Et le _xparamètre spécifie le fichier / dossier à ne pas inclure. Si ce qui précède ne fonctionne pas pour une raison quelconque, essayez plutôt ceci:

zip -r Target.zip Source -x "*.DS_Store" -x "__MACOSX"
Adil Hussain
la source
L'OP a demandé comment exclure le dossier __MACOSX. Votre premier extrait de code ne fonctionne évidemment pas, car il ne le nomme pas comme un dossier à exclure.
Chris Johnson
7
L' ziputilitaire de ligne de commande ne crée jamais de __MACOSXrépertoire, donc le premier extrait de code fonctionne et la -x "__MACOSX"partie n'est pas nécessaire.
nisetama le
15

J'utilise ce script Automator Shell pour le réparer après. Il apparaît comme élément de menu contextuel (clic droit sur n'importe quel fichier affiché 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 de script Shell"

script shell de l'automate

élément de menu contextuel dans le Finder

Benedikt
la source
Ne serait-il pas préférable de faire la compression à l'aide de zip dans le script Automator Shell, plutôt que de compresser à l'aide d'Apple intégré, puis de supprimer les fichiers indésirables?
Matt
@Matt vous pouvez ajouter l'étape d'archivage dans automator ou utiliser une autre commande shell également.
ttimasdf
@Matt également, Apple intégré gère la dénomination automatique des fichiers et l'incrémentation du nom lorsque le fichier existe. Avec le script shell, cette partie demanderait beaucoup de travail.
ttimasdf
1
Il génère une erreur si le dossier .DS_Store n'est pas présent dans l'archive. Je suggère une amélioration en ajoutant `|| true` après chaque commande zip (comme zip -d "$p" __MACOSX/\* || truedans votre réponse.
adamsfamily
1
Bien que les autres réponses soient bonnes, j'aime mieux celle-ci car elle peut être utilisée de manière très Macish.
not2savvy
10

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

zip -d filename.zip "__MACOSX*"

Fonctionne mieux pour moi

SabU
la source
8
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX": ignorez __MACOSX comme vous le mentionnez.
  • -x "*/\.*": ignorez tout fichier caché, tel que .DS_Store.
  • Citez la variable pour éviter le fichier s'il est nommé avec ESPACE.

En outre, vous pouvez créer le service Automator pour le rendre facilement utilisable dans Finder. Vérifiez le lien ci-dessous pour voir les détails si vous avez besoin.

Github

Jian Jason
la source
Heh, la seule bonne réponse parmi une mer d'ordures, est aussi celle qui a le moins de voix. / soupir
Heath Raftery
Cela a fonctionné pour moi, mais j'ai dû supprimer les guillemets et le symbole du dollar avant destFileName.zip et srcFileName
Alexander Poleschuk
3

L' ziputilitaire de ligne de commande ne crée jamais de __MACOSXrépertoire, vous pouvez donc simplement exécuter une commande comme celle-ci:

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

Dans la sortie ci-dessous, a.zipque j'ai créée avec l' ziputilitaire de ligne de commande ne contient pas de __MACOSXrépertoire, mais a 2.zipque j'ai créé à partir du 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_Storen'exclut pas les .DS_Storefichiers à l'intérieur des répertoires mais le -x \*.DS_Storefait.

Le fichier de niveau supérieur d'une archive zip avec plusieurs fichiers doit généralement être un répertoire unique, car si ce n'est pas le cas, certains utilitaires de désarchivage (comme unzipet 7z, mais pas Archive Utility, The Unarchiver unar, ou dtrx) ne créent pas de répertoire contenant pour le fichiers lorsque l'archive est extraite, ce qui rend souvent les fichiers difficiles à trouver, et si plusieurs archives comme celle-ci sont extraites en même temps, il peut être difficile de dire quels fichiers appartiennent à quelle archive.

L'utilitaire d'archivage crée uniquement un __MACOSXrépertoire 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 fourchette de ressources. Le __MACOSXrépertoire contient des fichiers AppleDouble dont le nom de fichier commence par ._qui sont utilisés pour stocker les métadonnées spécifiques à OS X. L' ziputilitaire de ligne de commande rejette les métadonnées telles que les attributs étendus, les indicateurs de fichier et les fourchettes de ressources, ce qui signifie également que les métadonnées telles que les balises sont perdues et que les alias cessent de fonctionner, car les informations d'un fichier d'alias sont stockées dans une fourchette de ressources.

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

nisetama
la source
Cela ne fonctionne que pour les répertoires, pas pour un groupe de fichiers dans un répertoire.
Michael Trouw
@MichaelTrouw Oui, mais vous ne devriez généralement pas créer une archive contenant plusieurs fichiers au niveau supérieur en premier lieu.
nisetama
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.
Michael Trouw
3

Vous ne pouvez pas.

Mais ce que vous pouvez faire est de supprimer ces dossiers indésirables après la compression. La ligne de commande zipprend différents arguments dont l'un, le -d, sert à supprimer le contenu basé sur une expression régulière. Vous pouvez donc l'utiliser comme ceci:

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

ne compresser aucun fichier caché:

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

avec cette question, ça devrait être comme:

zip newzipname filename.any  -x "\__MACOSX"

Il faut dire, cependant, que la commande zip s'exécute dans le terminal en compressant simplement le fichier, elle ne compresse pas les autres. Alors faites ceci, le résultat est le même:

zip newzipname filename.any
Xian Shu
la source
__MACOSXne commence pas par.
PJMeisch
ouais, j'ai fait une erreur. Il a été modifié. Merci de me le rappeler
Xian Shu
1

Voulez-vous dire l' zipoutil de ligne de commande ou la commande de compression du Finder?

Pour zip, vous pouvez essayer l' --data-forkoption. Si cela ne le fait pas, vous pouvez essayer --no-extra, bien que cela semble ignorer d'autres métadonnées de fichier qui pourraient être utiles, comme uid / gid et file times.

Pour la commande Compress du Finder, je ne pense pas qu'il existe des 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 -c -koptions, il crée des archives zip. Avec cet outil, vous pouvez expérimenter avec --norsrc, --noextattr, --noqtn, --noaclet / ou laisser simplement la --sequesterRsrcpossibilité (qui, selon la page de manuel, peut être responsable du __MACOSXsous - répertoire). Bien que, peut-être l'absence de --sequesterRsrcmoyen simplement d'utiliser le format AppleDouble, qui créerait des fichiers ._ partout au lieu d'un __MACOSXrépertoire.

Ken Thomases
la source
1
Oui, je fais référence à l'utilitaire "Compresser" du chercheur. Dans l'état actuel des choses, je reçois un dossier plein de fichiers ._ qui bousille l'apparence / l'éditeur de WordPress
Scott B
1

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. AUCUN logiciel supplémentaire, AUCUN truc compliqué de ligne de commande et AUCUN truc de shell.

Le flux de travail de l'automate:

  • Entrée: fichiers ou dossiers de n'importe quelle application.
  • Étape 1: Créer une archive, le système intégré avec les paramètres par défaut.
  • Étape 2: Exécutez la commande Shell, avec l'entrée comme paramètres. Copiez la commande ci-dessous.

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

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

Enregistrez-le et nous avons terminé! Faites un clic droit sur le dossier ou la masse de fichiers et choisissez le flux de travail dans le menu des services. Une archive sans métadonnées sera créée à côté.

Échantillon

ttimasdf
la source
0

Voici comment j'évite le __MACOSXrépertoire lors de la compression de fichiers avec la tarcommande:

$ 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

Supprimez d'abord l'attribut:

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

Exécutez à find . | xargs xattr -lnouveau, assurez-vous qu'aucun fichier ne possède l'attribut xattr. alors vous êtes prêt à partir:

tar cjvf file.tar.bz2 dir

Zhang Huangbin
la source