Mac comprimir sin la carpeta __MACOSX?

158

Cuando comprimo archivos con el compresor zip incorporado en Mac OSX, resulta en una carpeta adicional titulada "__MACOSX" creada en el zip extraído.

¿Puedo ajustar mi configuración para evitar que se cree esta carpeta o debo comprar una herramienta de compresión de terceros?

ACTUALIZACIÓN : Acabo de encontrar una aplicación gratuita para OSX que resuelve mi problema: " YemuZip "

ACTUALIZACIÓN 2 : YemuZip ya no es freeware

Scott B
fuente
La existencia de la carpeta _MACOSX no crea ningún problema. Simplemente bórralo.
Jayprakash Dubey
1
Esta pregunta parece estar fuera de tema porque debería estar en AskDifferent
Nakilon
11
Crea un problema con los servicios web exigentes que requieren un archivo zip inmaculado, por lo que estoy agradecido por las explicaciones
mccc 19/11/2015
21
@JayprakashDubey Es increiblemente irritante, y como usuario de Linux que le gusta, no dejando basura por todas partes que voy, no puedo soportar __MACOSX, .DS_Store, ._fileName, y todos los demás turds variedad de Mac OS cae en sus archivos. El 'tar' de OSX también hace esto, sin tener en cuenta el principio del mínimo asombro .
Wyatt8740

Respuestas:

80

Cuando tuve este problema, lo hice desde la línea de comandos:

zip file.zip uncompressed

EDITAR , después de muchos votos negativos: estaba usando esta opción hace algún tiempo y no sé dónde la aprendí, así que no puedo darle una mejor explicación. La respuesta de Chris Johnson es correcta, pero no borraré la mía. Como dice un comentario, es más preciso a lo que pregunta OP, ya que se comprime sin esos archivos, en lugar de eliminarlos de un archivo comprimido. También me resulta más fácil de recordar.

sinuhepop
fuente
33
Esto carece de explicación.
Raptor
2
El subdirectorio __MACOSX / contiene bifurcaciones de recursos de Mac y se crea cuando utiliza herramientas de Mac para crear el archivo zip. Del mismo modo, las herramientas de Mac consumirán el subdirectorio __MACOSX / para configurar los tenedores de recursos, y nunca lo verás. Sin embargo, si usa herramientas de Mac para crear el archivo zip y algunas otras herramientas para descomprimirlo, obtendrá el directorio __MACOSX / y no los tenedores de recursos. Si crea el archivo con zip, que es una aplicación de terceros, entonces el directorio __MACOSX / nunca se crea en primer lugar.
Edward Falk
Vea mi respuesta para una manera fácil de eliminar la carpeta _MACOSX después de crear el archivo zip.
Chris Johnson
3
Para comprimir un directorio de forma recursiva sin __MACOSX y otros:zip -rX file.zip uncompressed_directory
Konstantin Suvorov
319

Se puede arreglar después del hecho por zip -d filename.zip __MACOSX/\*

Chris Johnson
fuente
51
también para eliminar archivos .DS_Store:zip -d filename.zip \*/.DS_Store
Benedikt Köppel
55
La respuesta aceptada dice cómo no obtener el directorio __MACOSX / en primer lugar, pero no dice nada sobre qué hacer con un archivo .zip existente. Esta respuesta dice cómo deshacerse de __MACOSX / si ya lo tiene. Sin embargo, la pregunta original era cómo no obtenerla en primer lugar, por lo que la respuesta aceptada es la correcta.
Edward Falk
¿Cómo podría hacer esto de forma recursiva para todos los archivos zip?
Wowfunhappy
Para aplicar a todos los archivos zip en virtud de alguna raíz: find ~ -type f -name '*.zip' -exec zip -d '{}' __MACOSX/\* \;. Sustituya su punto de partida ~.
Chris Johnson
Una función para eliminar todos los archivos basura: cleanzip(){ zip -d $1 $2 __MACOSX/\* \*/.DS_Store; }. Uso: cleanzip file.zipo cleanzip file.zip MORE_JUNK_FILES(el segundo parámetro es opcional)
mrdaliri
57

Dentro de la carpeta que quieres comprimir, en la terminal:

zip -r -X Archive.zip *

Donde -X significa: Excluir esos archivos invisibles de recursos de Mac como "_MACOSX" o "._Filename" y .ds almacenar archivos

fuente

Nota: Solo funcionará para la carpeta y el árbol de carpetas posterior en el que se encuentra y debe tener el *comodín.

pompalini
fuente
9
Esto no funciona como cree: -Xno excluye los archivos .DS_Store. La razón por la que puede funcionar para su aplicación es que solo está comprimiendo *, que es un comodín que coincide con los archivos que no comienzan con ".". Pruébelo en un directorio que contenga un archivo de puntos, y verá que se incluye.
spinup
Vea mi respuesta para una manera fácil de eliminar la carpeta _MACOSX después de crear el archivo zip.
Chris Johnson
1
No. Hacer zip -r -X Archive.zip myfolderen una carpeta todavía da como resultado un archivo zip que contiene el archivo .DS_Store.
Rockallite
@Rockallite: tiene razón, esto solo funcionará cuando comprima las carpetas, el árbol o los archivos en la carpeta en la que se encuentra. Por lo tanto, no puede pasar una carpeta como argumento o no funcionará como se esperaba, solo con el comodín * funciona.
pompalini
Esto funciona para archivos dentro de directorios, en lugar de comprimir una carpeta completa.
Michael Trouw
26

Este comando lo hizo por mí:

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

Target.zipes el archivo zip para crear. Sourcees el archivo / carpeta de origen para comprimir. Y el _xparámetro especifica el archivo / carpeta a no incluir. Si lo anterior no funciona por alguna razón, intente esto en su lugar:

zip -r Target.zip Source -x "*.DS_Store" -x "__MACOSX"
Adil Hussain
fuente
El OP preguntó cómo excluir la carpeta __MACOSX. Su primer fragmento de código obviamente no funciona, porque no lo nombra como una carpeta para excluir.
Chris Johnson
77
La ziputilidad de línea de comandos nunca crea un __MACOSXdirectorio, por lo que el primer fragmento funciona y la -x "__MACOSX"parte no es necesaria.
nisetama
15

Estoy usando este Automator Shell Script para arreglarlo después. Se muestra como elemento de menú contextual (haciendo clic con el botón derecho en cualquier archivo que aparezca en Finder).

while read -r p; do
  zip -d "$p" __MACOSX/\* || true
  zip -d "$p" \*/.DS_Store || true
done
  1. Crea un nuevo servicio con Automator
  2. Seleccione "Archivos y carpetas" en "Finder"
  3. Agregar una "Acción de script de Shell"

script de shell del automatizador

elemento del menú contextual en Finder

benedikt
fuente
¿No sería mejor hacer la compresión usando zip en el Automator Shell Script, en lugar de comprimir usando Apple incorporado, y luego eliminar los archivos no deseados?
Matt
@Matt puede agregar el paso de archivo en el automatizador o usar otro comando de shell también.
ttimasdf
@Matt también, Apple incorporado maneja el nombre automático de archivos y el incremento de nombre cuando existe el archivo. Con el script de shell, esta parte sería mucho trabajo.
ttimasdf
1
Lanza un error si la carpeta .DS_Store no está presente en el archivo. Sugiero una mejora agregando `|| verdadero` después de cada comando zip (como zip -d "$p" __MACOSX/\* || trueen su respuesta.
adamsfamily
1
Si bien las otras respuestas son buenas, esta me gusta más porque puede usarse de una manera muy macabra.
not2savvy
10

Las carpetas no deseadas también se pueden eliminar de la siguiente manera:

zip -d filename.zip "__MACOSX*"

Funciona mejor para mi

SabU
fuente
8
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX": ignore __MACOSX como usted menciona.
  • -x "*/\.*": ignora cualquier archivo oculto, como .DS_Store.
  • Cite la variable para evitar el archivo si se nombra con SPACE.

Además, puede crear el Servicio Automator para que sea más fácil de usar en Finder. Verifique el enlace a continuación para ver detalles si lo necesita.

Github

Jian Jason
fuente
Je, la única respuesta correcta entre un mar de basura, es también la que tiene menos votos. / suspiro
Heath Raftery
Funcionó para mí, pero tuve que eliminar las comillas y el símbolo del dólar antes de destFileName.zip y srcFileName
Alexander Poleschuk
3

La ziputilidad de línea de comandos nunca crea un __MACOSXdirectorio, por lo que puede ejecutar un comando como este:

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

En el resultado a continuación, a.ziplo que creé con la ziputilidad de línea de comandos no contiene un __MACOSXdirectorio, pero sí a 2.ziplo creé desde 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_Storeno excluye .DS_Storearchivos dentro de directorios pero lo -x \*.DS_Storehace.

El archivo de nivel superior de un archivo zip con varios archivos generalmente debería ser un solo directorio, porque si no lo es, algunas utilidades de desarchivado (como unzipy 7z, pero no la Utilidad de archivo, The Unarchiver unar, o dtrx) no crean un directorio contenedor para archivos cuando se extrae el archivo, lo que a menudo hace que los archivos sean difíciles de encontrar, y si se extraen varios archivos como ese al mismo tiempo, puede ser difícil saber qué archivos pertenecen a qué archivo.

Archive Utility solo crea un __MACOSXdirectorio cuando crea un archivo en el que al menos un archivo contiene metadatos como atributos extendidos, marcas de archivo o una bifurcación de recursos. El __MACOSXdirectorio contiene archivos AppleDouble cuyo nombre de archivo comienza con los ._que se utilizan para almacenar metadatos específicos de OS X. La ziputilidad de línea de comandos descarta metadatos como atributos extendidos, marcas de archivo y bifurcaciones de recursos, lo que también significa que se pierden metadatos como etiquetas y que los alias dejan de funcionar, porque la información en un archivo de alias se almacena en una bifurcación de recursos.

Normalmente, puede descartar los metadatos específicos de OS X, pero puede ver qué archivos de metadatos contienen xattr -l. xattrtambién incluye bifurcaciones de recursos y marcas de archivo, porque aunque en realidad no se almacenan como atributos extendidos, se puede acceder a ellos a través de la interfaz de atributos extendidos. Tanto Archive Utility como la ziplínea de comandos descartan ACL.

nisetama
fuente
Esto solo funciona para directorios, no para un montón de archivos dentro de un directorio.
Michael Trouw
@MichaelTrouw Sí, pero en general no debería crear un archivo que contenga varios archivos en el nivel superior en primer lugar.
nisetama
Estoy de acuerdo en estar en desacuerdo porque hay casos de uso en los que esto está bien. Por ejemplo, uno en el que el usuario final de un archivo zip nunca será un usuario. Pero un servidor.
Michael Trouw
3

No puedes

Pero lo que puede hacer es eliminar esas carpetas no deseadas después de comprimirlas. La línea de comando ziptoma diferentes argumentos donde uno, el -d, es para eliminar contenidos basados ​​en una expresión regular. Entonces puedes usarlo así:

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

no comprima ningún archivo oculto:

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

con esta pregunta, debería ser como:

zip newzipname filename.any  -x "\__MACOSX"

Sin embargo, debe decirse que el comando zip se ejecuta en la terminal simplemente comprimiendo el archivo, no comprime ningún otro. Entonces haz esto, el resultado es el mismo:

zip newzipname filename.any
Xian Shu
fuente
__MACOSXno comienza con.
PJMeisch
Sí, cometí un error. Ha sido modificado. Gracias por recordármelo
Xian Shu
1

¿Te refieres a la zipherramienta de línea de comandos o al comando Comprimir del Finder?

Para zip, puedes probar la --data-forkopción. Si eso no lo hace, puede intentarlo --no-extra, aunque parece ignorar otros metadatos de archivo que podrían ser valiosos, como uid / gid y tiempos de archivo.

Para el comando Comprimir del Finder, no creo que haya ninguna opción para controlar su comportamiento. Es por el simple caso.

La otra herramienta, y tal vez la que el Finder realmente usa debajo del capó, es ditto. Con las -c -kopciones, crea archivos zip. Con esta herramienta, se puede experimentar con --norsrc, --noextattr, --noqtn, --noacly / o, simplemente, dejar fuera de la --sequesterRsrcopción (que, de acuerdo con la página del manual, puede ser responsable de la __MACOSXsubdirectorio). Aunque, tal vez la ausencia de --sequesterRsrcsimplemente significa usar el formato AppleDouble, lo que crearía archivos ._ por todas partes en lugar de un __MACOSXdirectorio.

Ken Thomases
fuente
1
Sí, me refiero a la utilidad "Comprimir" del buscador. Tal como están las cosas, estoy obteniendo una carpeta llena de archivos ._ que arruina la apariencia / editor de WordPress
Scott B
1

Tengo una mejor solución después de leer todas las respuestas existentes. Todo podría hacerse mediante un flujo de trabajo con un solo clic derecho. SIN software adicional, SIN complicados elementos de línea de comandos y SIN trucos de shell.

El flujo de trabajo del automatizador:

  • Entrada: archivos o carpetas desde cualquier aplicación.
  • Paso 1: Crear archivo, el sistema está integrado con los parámetros predeterminados.
  • Paso 2: Ejecute el comando Shell, con la entrada como parámetros. Copiar el comando a continuación.

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

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

¡Guárdalo y listo! Simplemente haga clic derecho en la carpeta o en la mayor parte de los archivos y elija el flujo de trabajo del menú de servicios. El archivo sin metadatos se creará junto con.

Muestra

ttimasdf
fuente
0

Así es como evito el __MACOSXdirectorio cuando comprimo archivos con el 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

Eliminar el atributo primero:

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

Ejecute find . | xargs xattr -lnuevamente, asegúrese de que ningún archivo tenga el atributo xattr. entonces eres bueno para ir:

tar cjvf file.tar.bz2 dir

Zhang Huangbin
fuente