203

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

我可以调整我的设置以防止创建此文件夹还是需要购买第三方压缩工具?

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

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

4

15 回答 15

349

事后可以通过以下方式修复zip -d filename.zip __MACOSX/\*

于 2012-12-02T01:28:35.393 回答
109

当我遇到这个问题时,我已经从命令行完成了:

zip file.zip uncompressed

编辑,经过多次否决:我之前使用过这个选项,我不知道我在哪里学到的,所以我不能给你更好的解释。克里斯约翰逊的回答是正确的,但我不会删除我的。正如一条评论所说,它对 OP 的要求更准确,因为它在没有这些文件的情况下进行压缩,而不是从压缩文件中删除它们。我也觉得更容易记住。

于 2012-07-10T12:47:13.100 回答
82

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

zip -r -X Archive.zip *

其中-X表示:排除“_MACOSX”或“._Filename”等不可见的Mac资源文件和.ds存储文件

资源

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

于 2014-04-29T18:12:53.947 回答
37

这个命令为我做了:

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

Target.zip是要创建的 zip 文件。Source是要压缩的源文件/文件夹。并且-x参数指定要排除的文件/文件夹。如果上述方法由于某种原因不起作用,请尝试以下方法:

zip -r Target.zip Source -x "*.DS_Store" -x "__MACOSX"
于 2014-03-21T14:24:51.680 回答
18

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

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

自动化外壳脚本

Finder 中的上下文菜单项

于 2016-05-25T07:05:34.470 回答
12
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX":忽略你提到的__MACOSX。
  • -x "*/\.*":忽略任何隐藏文件,例如 .DS_Store 。
  • 如果变量以空格命名,请引用该变量以避免文件。

此外,您可以构建 Automator Service 以使其在 Finder 中轻松使用。如果需要,请查看下面的链接以查看详细信息。

Github

于 2018-06-11T08:10:54.780 回答
11

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

zip -d filename.zip "__MACOSX*"

最适合我

于 2016-05-09T15:51:06.383 回答
5

命令行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 存档的顶级文件通常应该是一个目录,因为如果不是,一些取消存档实用程序(如unzipand 7z,但不是存档实用程序、Unarchiverunardtrx)不会为提取档案时的文件,这通常会使文件难以找到,并且如果同时提取多个类似的档案,则可能很难分辨哪些文件属于哪个档案。

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

通常您可以丢弃特定于 OS X 的元数据,但要查看元数据文件包含哪些内容,您可以使用xattr -l. xattr还包括资源分叉和文件标志,因为即使它们实际上并未存储为扩展属性,也可以通过扩展属性接口访问它们。存档实用程序和zip命令行实用程序都会丢弃 ACL。

于 2016-01-02T18:50:15.187 回答
4

你不能。

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

zip -d filename.zip __MACOSX/\*
于 2016-04-26T04:52:17.803 回答
3

清理 .zip.DS_Store__MACOSX,包括子文件夹:

zip -d archive.zip '__MACOSX/*' '*/__MACOSX/*' .DS_Store '*/.DS_Store'

演练:

  1. 像往常一样通过右键单击文件(或文件夹)并选择“压缩...”来创建 .zip
  2. 打开终端应用程序(在 Spotlight 搜索中搜索终端)
  3. 在终端中输入zip (但不要按回车键)
  4. 将 .zip 拖到终端,使其转换为路径
  5. 复制粘贴-d '__MACOSX/*' '*/__MACOSX/*' .DS_Store '*/.DS_Store'
  6. 点击进入
  7. 用于zipinfo archive.zip列出里面的文件,检查(可选)
于 2021-04-08T10:07:45.633 回答
2

不要压缩任何隐藏文件:

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

带着这个问题,应该是这样的:

zip newzipname filename.any  -x "\__MACOSX"

必须说,虽然 zip 命令在终端中运行只是压缩文件,它不会压缩任何其他文件。所以这样做结果是一样的:

zip newzipname filename.any
于 2017-05-09T01:39:10.793 回答
2

阅读所有现有答案后,我有一个更好的解决方案。只需单击鼠标右键,一切都可以通过工作流程完成。 没有额外的软件,没有复杂的命令行内容,也没有shell 技巧。

自动化工作流程:

  • 输入:来自任何应用程序的文件或文件夹。
  • 第一步:创建存档,系统自带默认参数。
  • 第二步:运行Shell命令,输入参数。复制下面的命令。

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

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

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

样本

于 2017-12-19T05:11:54.890 回答
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目录。

于 2012-06-07T01:09:50.250 回答
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

于 2018-02-23T14:42:06.870 回答
0

可以与 Automator 工具一起使用的另一个 shell 脚本(另请参阅 benedikt 关于如何创建脚本的答案)是:

while read -r f; do
    d="$(dirname "$f")"
    n="$(basename "$f")"
    cd "$d"
    zip "$n.zip" -x \*.DS_Store -r "$n"
done

这里的不同之处在于,此代码直接压缩选定的文件夹,没有 macOS 特定文件(而不是先压缩后删除)。

于 2020-10-13T22:59:08.113 回答