没有__MACOSX文件夹的Mac zip压缩文件?


158

当我在Mac OSX中使用内置的zip压缩器压缩文件时,会在提取的zip文件中创建一个名为“ __MACOSX”的额外文件夹。

是否可以调整设置以防止创建此文件夹,或者是否需要购买第三方压缩工具?

更新:我刚刚找到了用于OSX的免费软件,可以解决我的问题:“ YemuZip

更新2:YemuZip不再是免费软件


_MACOSX文件夹的存在不会造成任何问题。只需删除它。
Jayprakash Dubey 2014年

1
这个问题似乎是题外话,因为它应该在AskDifferent
Nakilon'1

11
它创建需要一个纯净的zip压缩包挑剔的web服务的问题,所以我的解释感激
MCCC

21
@JayprakashDubey这是incredibily刺激性,和谁喜欢不留下垃圾到处都是,我去一个Linux用户,我无法忍受__MACOSX.DS_Store._fileName,和所有其他各种turds的Mac OS滴在其档案。OSX的'tar'做到了这一点-在公然无视最小惊讶原则的情况下
Wyatt8740 '16

Answers:


80

当我遇到这个问题时,我是通过命令行完成的:

zip file.zip uncompressed

EDIT,经过了许多否决:我在一段时间前就使用了这个选项,但我不知道从哪里学到的,所以无法给您更好的解释。克里斯·约翰逊的答案是正确的,但我不会删除我的。就像一条评论所说,它更符合OP的要求,因为它不使用那些文件进行压缩,而不是将它们从压缩文件中删除。我发现它也更容易记住。


33
这没有解释。
猛禽2014年

2
__MACOSX /子目录包含Mac资源分支,并在使用Mac工具创建zip文件时创建。同样,Mac工具将使用__MACOSX /子目录来设置资源派生,您将永远看不到它。但是,如果使用Mac工具创建zip文件,并使用其他一些工具将其解压缩,则将获得__MACOSX /目录,而不是资源派生目录。如果使用zip第三方应用程序来创建文件,则__MACOSX /目录永远不会被首先创建。
Edward Falk

请参阅我的答案,以获取创建zip文件后删除_MACOSX文件夹的简便方法。
克里斯·约翰逊

3
要递归压缩目录而不使用__MACOSX和其他文件:zip -rX file.zip uncompressed_directory
Konstantin Suvorov

319

事实成立后可以通过 zip -d filename.zip __MACOSX/\*


51
还要删除.DS_Store文件:zip -d filename.zip \*/.DS_Store
BenediktKöppel2015年

5
接受的答案说明了如何首先不获取__MACOSX /目录,但没有说明如何处理现有的.zip文件。此答案说明了如何删除__MACOSX /(如果已安装)。但是,最初的问题是如何一开始就不要得到它,因此公认的答案是正确的。
Edward Falk

如何对所有zip文件进行递归处理?
Wowfunhappy

应用于某个根目录下的所有zip文件:find ~ -type f -name '*.zip' -exec zip -d '{}' __MACOSX/\* \;。将起点替换为~
克里斯·约翰逊

删除所有垃圾文件的功能:cleanzip(){ zip -d $1 $2 __MACOSX/\* \*/.DS_Store; }。用法:cleanzip file.zipcleanzip file.zip MORE_JUNK_FILES(第二个参数是可选的)
mrdaliri

56

在终端中要压缩的文件夹内:

zip -r -X Archive.zip *

-X的含义:排除那些不可见的Mac资源文件,例如“ _MACOSX”或“ ._Filename”以及.ds存储文件

资源

注意:仅适用于您所在的文件夹和后续文件夹树,并且必须具有*通配符。


9
这不起作用,就像您认为的那样:-X不排除.DS_Store文件。它可能对您的应用程序有效的原因是您只压缩了zip *,这是一个匹配文件,不能以“。”开头。在包含点文件的目录上尝试它,您将看到它包含在内。
向上旋转

请参阅我的答案,以获取创建zip文件后删除_MACOSX文件夹的简便方法。
克里斯·约翰逊

1
zip -r -X Archive.zip myfolder。在文件夹上进行操作仍会导致包含.DS_Store文件的zip文件。
Rockallite

@Rockallite:您是正确的,只有当您压缩文件夹中的文件夹,树或文件时,此功能才起作用。因此,您不能将文件夹作为参数传递,否则将无法正常工作,仅使用*通配符即可这行得通。
pompalini

这适用于目录中的文件,而不是压缩完整的文件夹。
Michael Trouw

26

这个命令为我做到了:

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

Target.zip是要创建的zip文件。Source是要压缩的源文件/文件夹。并且该_x参数指定不包含的文件/文件夹。如果以上原因由于任何原因都不起作用,请尝试以下方法:

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

OP询问如何排除__MACOSX文件夹。您的第一个代码段显然不起作用,因为它没有将其命名为要排除的文件夹。
克里斯·约翰逊

7
zip命令行实用程序绝不会创建一个__MACOSX目录,所以第一个片段做的工作,而-x "__MACOSX"没有必要组成部分。
nisetama '16

15

我正在使用此Automator Shell脚本对其进行修复。它显示为上下文菜单项(右键单击Finder中显示的任何文件)。

while read -r p; do
  zip -d "$p" __MACOSX/\* || true
  zip -d "$p" \*/.DS_Store || true
done
  1. 使用Automator创建新服务
  2. 在“查找器”中选择“文件和文件夹”
  3. 添加“ Shell脚本操作”

自动化外壳程序脚本

Finder中的上下文菜单项


在Automator Shell脚本中使用zip进行压缩,而不是使用Apple内置的压缩​​,然后删除不需要的文件,这会更好吗?
马特

@Matt,您可以在automator中添加存档步骤,也可以使用另一个shell命令。
ttimasdf

此外,@ Matt,Apple内置功能可在文件存在时自动处理文件命名和名称递增。使用shell脚本,这部分工作会很多。
ttimasdf

1
如果档案中不存在.DS_Store文件夹,则会引发错误。我建议通过添加| ||进行改进 在每个zip命令后zip -d "$p" __MACOSX/\* || true输入“
true”

1
虽然其他答案都不错,但我最喜欢这个答案,因为它可以非常Macish的方式使用。
not2savvy

10

不需要的文件夹也可以通过以下方式删除:

zip -d filename.zip "__MACOSX*"

最适合我


8
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX":忽略您提到的__MACOSX。
  • -x "*/\.*":忽略任何隐藏文件,例如.DS_Store。
  • 如果使用SPACE命名,请用引号将该变量加以避免文件。

此外,您可以构建Automator Service,以使其易于在Finder中使用。检查下面的链接以查看详细信息。

Github


嘿,在一片垃圾中,唯一正确的答案也是投票最少的那个。/ sigh
Heath Raftery

它对我有用,但是我必须删除destFileName.zip和srcFileName之前的引号和美元符号
Alexander Poleschuk

3

zip命令行实用程序绝不会创建一个__MACOSX目录,这样你就可以运行如下命令:

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

在下面的输出中,a.zip我使用zip命令行实用程序创建的__MACOSX目录不包含目录,但是a 2.zip从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不会排除.DS_Store目录中的文件,但-x \*.DS_Store会排除。

包含多个文件的zip归档文件的顶级文件通常应位于一个目录中,因为如果不是,则某些未归档实用程序(例如unzip和和7z,但不是Archive Utility,The Unarchiver unardtrx)不会为该目录创建包含目录。提取存档文件时,通常会导致文件查找困难,并且如果同时提取多个这样的存档文件,则很难判断哪些文件属于哪个存档文件。

存档实用程序仅__MACOSX在创建存档时创建目录,其中至少一个文件包含元数据,例如扩展属性,文件标志或资源派生。该__MACOSX目录包含以文件名开头的AppleDouble文件,这些文件._用于存储OS X特定的元数据。该zip命令行实用程序丢弃元数据,诸如扩展属性,文件标志和资源叉,这也意味着元数据如标签丢失,并且别名停止工作,因为在一个别名文件中的信息被存储在资源派生。

通常,您可以只丢弃OS X特定的元数据,但是可以使用查看要包含的元数据文件xattr -lxattr还包括资源派生和文件标志,因为即使它们实际上并没有存储为扩展属性,也可以通过扩展属性接口进行访问。存档实用程序和zip命令行实用程序均丢弃ACL。


这仅适用于目录,不适用于目录中的一堆文件。
Michael Trouw

@MichaelTrouw是的,但通常不应首先创建一个包含多个文件的归档文件。
nisetama '16

我同意不同意,因为在某些情况下可以使用。例如,一个zipfile的最终用户永远都不是用户。但是一台服务器。
Michael Trouw

3

你不能

但是您可以做的是在压缩后删除那些不需要的文件夹。命令行zip采用不同的参数,其中一个-d用于删除基于正则表达式的内容。因此,您可以像这样使用它:

zip -d filename.zip __MACOSX/\*

2

不要压缩任何隐藏文件:

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

带着这个问题,应该像这样:

zip newzipname filename.any  -x "\__MACOSX"

必须说,尽管zip命令在终端中运行,只是压缩文件,而不压缩其他文件。这样做的结果是一样的:

zip newzipname filename.any

__MACOSX与不启动.
PJMeisch

是的,我弄错了。已被修改。感谢您提醒我
鲜树

1

您是指zip命令行工具还是Finder的Compress命令?

对于zip,您可以尝试该--data-fork选项。如果这样做不行,您可以尝试--no-extra,尽管这似乎会忽略其他可能有价值的文件元数据,例如uid / gid和文件时间。

对于Finder的Compress命令,我认为没有任何选项可以控制其行为。这是简单的情况。

另一个工具(也许是Finder实际在幕后使用的工具)是ditto。使用这些-c -k选项,它将创建zip存档。有了这个工具,你可以尝试--norsrc--noextattr--noqtn--noacl和/或简单地离开关闭--sequesterRsrc选项(而根据该男子页,可以负责的__MACOSX子目录)。虽然,也许缺少--sequesterRsrc使用AppleDouble格式的简单方法,但它会在整个地方而不是一个__MACOSX目录中创建._文件。


1
是的,我指的是发现者的“ Compress”实用程序。正因为如此,我得到一个完整的._文件的文件夹,其搞砸了WordPress的外观/编辑
斯科特乙

1

阅读所有存在的答案后,我有一个更好的解决方案。只需单击一下鼠标,工作流程就可以完成所有操作。 没有额外的软件,没有复杂的命令行内容,没有外壳技巧。

自动化器工作流程:

  • 输入:来自任何应用程序的文件或文件夹。
  • 第1步:创建存档,这是使用默认参数内置的系统。
  • 步骤2:运行Shell命令,将输入作为参数。复制下面的命令。

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

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

保存并完成!只需右键单击文件夹或大量文件,然后从服务菜单中选择工作流程。没有元数据的存档将被创建。

样品


0

这是我__MACOSX使用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

首先删除属性:

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

find . | xargs xattr -l再次运行,确保没有任何文件具有xattr属性。那么您很好:

tar cjvf file.tar.bz2 dir

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.