【问题标题】:Mac zip compress without __MACOSX folder?没有__MACOSX文件夹的Mac zip压缩?
【发布时间】:2012-06-11 01:26:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • _MACOSX 文件夹的存在不会产生任何问题。直接删除即可。
  • 这个问题似乎是题外话,因为它应该在 AskDifferent
  • 它对需要原始 zip 存档的挑剔网络服务造成了问题,因此我很感谢您的解释
  • @JayprakashDubey 令人难以置信的恼人,作为一个喜欢不随处扔垃圾的 Linux 用户,我受不了__MACOSX.DS_Store._fileName 和所有其他各种turds Mac OS 放入其档案中。 OSX 的 `tar' 也能做到这一点——公然无视principle of least astonishment

标签: macos zip


【解决方案1】:

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

【讨论】:

  • 同时删除 .DS_Store 文件:zip -d filename.zip \*/.DS_Store
  • 接受的答案首先说明了如何不获取 __MACOSX/ 目录,但没有说明如何处理现有的 .zip 文件。这个答案说明了如何摆脱 __MACOSX/ 如果你已经得到它。但是,最初的问题是如何不首先得到它,所以接受的答案是正确的。
  • 如何对所有 zip 文件递归地执行此操作?
  • 应用于某个根目录下的所有 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(第二个参数可选)
【解决方案2】:

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

zip file.zip uncompressed

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

【讨论】:

  • 这缺乏解释。
  • __MACOSX/ 子目录包含 Mac 资源分支,是在您使用 Mac 工具创建 zip 文件时创建的。同样,Mac 工具将使用 __MACOSX/ 子目录来设置资源分叉,而您甚至永远看不到它。但是,如果您使用 Mac 工具创建 zip 文件并使用其他一些工具将其解压缩,您将获得 __MACOSX/ 目录而不是资源分叉。如果您使用zip 创建文件,这是一个第三方应用程序,那么__MACOSX/ 目录永远不会被创建。
  • 查看我的答案,了解创建 zip 文件后删除 _MACOSX 文件夹的简单方法。
  • 不使用__MACOSX等递归压缩目录:zip -rX file.zip uncompressed_directory
  • 预防胜于治疗,简单胜于复杂。现在,如果我们将其添加为 Automator 服务,我们将拥有自己的生产力野兽。很好的解决方案。
【解决方案3】:

在你要压缩的文件夹里面,在终端里:

zip -r -X Archive.zip *

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

source

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

【讨论】:

  • 这并不像你想象的那样工作:-X 不排除 .DS_Store 文件。它可能适用于您的应用程序的原因是您只是在压缩*,这是一个匹配不以“.”开头的文件的通配符。在包含点文件的目录上尝试它,您会看到它被包含在内。
  • 查看我的回答,了解创建 zip 文件后删除 _MACOSX 文件夹的简单方法。
  • 没有。对文件夹执行 zip -r -X Archive.zip myfolder 仍会生成包含 .DS_Store 文件的 zip 文件。
  • @Rockallite:你是对的,这只有在你压缩你所在文件夹中的文件夹、树或文件时才有效。因此你不能将文件夹作为参数传递,否则它不会像预期,只有使用 * 通配符才能工作。
【解决方案4】:

这个命令为我做了:

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 文件夹。您的第一个代码 sn-p 显然不起作用,因为它没有将其命名为要排除的文件夹。
  • zip 命令行实用程序从不创建 __MACOSX 目录,因此第一个 sn-p 确实有效,并且不需要 -x "__MACOSX" 部分。
【解决方案5】:

我正在使用这个 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 脚本操作”

【讨论】:

  • 在 Automator Shell Script 中使用 zip 进行压缩,而不是使用 Apple 内置的压缩​​,然后删除不需要的文件会更好吗?
  • @Matt 您可以在 automator 中添加存档步骤,也可以使用其他 shell 命令。
  • @Matt 同样,Apple 内置处理文件存在时的自动文件命名和名称增量。使用 shell 脚本,这部分工作量很大。
  • 如果存档中不存在 .DS_Store 文件夹,则会引发错误。我建议通过添加 ` || 进行改进true` 在每个 zip 命令之后(例如 zip -d "$p" __MACOSX/\* || true 到您的答案中。
  • 虽然其他答案都不错,但我最喜欢这个答案,因为它可以以非常 Macish 的方式使用。
【解决方案6】:
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX":忽略你提到的__MACOSX。
  • -x "*/\.*":忽略任何隐藏文件,例如 .DS_Store 。
  • 引用变量以避免使用 SPACE 命名的文件。

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

Github

【讨论】:

  • 呵呵,垃圾海洋中唯一正确的答案,也是得票最少的。 /叹息
  • 它对我有用,但我必须删除 destFileName.zip 和 srcFileName 之前的引号和美元符号
【解决方案7】:

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

zip -d filename.zip "__MACOSX*"

最适合我

【讨论】:

    【解决方案8】:

    zip 命令行实用程序从不创建__MACOSX 目录,因此您只需运行如下命令:

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

    在下面的输出中,我使用zip 命令行实用程序创建的a.zip 不包含__MACOSX 目录,但我从Finder 创建的a 2.zip 包含。

    $ 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 存档的顶级文件通常应该是一个目录,因为如果不是,一些取消存档的实用程序(如 unzip7z,但不是存档实用程序,Unarchiver,@987654334 @, 或dtrx) 解压存档时不要为文件创建包含目录,这通常会使文件难以找到,如果同时提取多个类似的存档,则很难分辨哪些文件属于哪个存档。

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

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

    【讨论】:

    • 这仅适用于目录,不适用于目录中的一堆文件。
    • @MichaelTrouw 是的,但您通常不应该首先在顶层创建包含多个文件的存档。
    • 我同意不同意,因为有些用例可以这样做。例如,zipfile 的最终用户永远不会是用户。而是一个服务器。
    【解决方案9】:

    你不能。

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

    zip -d filename.zip __MACOSX/\*
    

    【讨论】:

      【解决方案10】:

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

      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 列出里面的文件,检查(可选)

      【讨论】:

        【解决方案11】:

        不要压缩任何隐藏文件:

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

        这个问题应该是这样的:

        zip newzipname filename.any  -x "\__MACOSX"
        

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

        zip newzipname filename.any
        

        【讨论】:

        • __MACOSX 不以.开头
        • 是的,我犯了一个错误。它已被修改。谢谢提醒
        【解决方案12】:

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

        自动化工作流程:

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

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

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

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

        【讨论】:

        • 这是最好的解决方案!太感谢了!我使用谷歌翻译中的相机来验证这个截图中的一些具体设置(因为我自己看不懂中文,很遗憾),但这很好用。它会在同一文件夹中创建一个干净的 Archive.zip。很好。 :-)
        • @ErikvanderNeut 不便之处见谅,我只是随便贴了一张我当时自己配置的截图?稍后我会更新答案
        • 这都是好人 :-) 我真的很喜欢你的解决方案,所以感谢你发布它。
        • 如果你用英文截图会更好。
        【解决方案13】:

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

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

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

        另一个工具,也许是 Finder 在后台实际使用的工具,是 ditto。使用 -c -k 选项,它会创建 zip 存档。使用此工具,您可以尝试使用 --norsrc--noextattr--noqtn--noacl 和/或干脆放弃 --sequesterRsrc 选项(根据手册页,它可能负责 @987654332 @子目录)。虽然,--sequesterRsrc 的缺失可能只是意味着使用 AppleDouble 格式,这将在整个位置创建 ._ 文件,而不是一个 __MACOSX 目录。

        【讨论】:

        • 是的,我指的是查找器的“压缩”实用程序。事实上,我得到了一个充满 ._ 文件的文件夹,这些文件搞砸了 WordPress 的外观/编辑器
        【解决方案14】:

        这就是我在使用tar 命令压缩文件时避免__MACOSX 目录的方法:

        $ 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

        【讨论】:

          【解决方案15】:

          另一个可以与 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-08-13
            • 2016-01-10
            • 1970-01-01
            • 1970-01-01
            • 2015-04-05
            • 1970-01-01
            • 2022-10-07
            • 2011-11-30
            • 1970-01-01
            相关资源
            最近更新 更多