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

时间:2012-06-07 00:39:51

标签: macos zip

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

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

更新:我刚刚找到一个解决我问题的OSX免费软件:“YemuZip

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

15 个答案:

答案 0 :(得分:295)

可以在zip -d filename.zip __MACOSX/\*

之后修复

答案 1 :(得分:69)

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

zip file.zip uncompressed

许多downvotes之后

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

答案 2 :(得分:47)

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

zip -r -X Archive.zip *

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

source

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

答案 3 :(得分:23)

这个命令为我做了:

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

Target.zip是要创建的zip文件。 Source是要压缩的源文件/文件夹。 _x参数指定不包含的文件/文件夹。如果上述因任何原因无效,请尝试以下方法:

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

答案 4 :(得分:14)

我使用此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脚本操作"
  4. automator shell script

    contextual menu item in Finder

答案 5 :(得分:7)

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

zip -d filename.zip "__MACOSX*"

最适合我

答案 6 :(得分:3)

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

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

在下面的输出中,我使用a.zip命令行实用程序创建的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,unardtrx)在提取存档时不会为文件创建包含目录,这通常会使文件难以找到,并且如果在同一个文件中提取多个这样的存档时间,可能很难分辨哪些文件属于哪个档案。

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

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

答案 7 :(得分:2)

你做不到。

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

zip -d filename.zip __MACOSX/\*

答案 8 :(得分:2)

不要压缩任何隐藏文件:

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

有了这个问题,应该是这样的:

zip newzipname filename.any  -x "\__MACOSX"

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

zip newzipname filename.any

答案 9 :(得分:2)

zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX":忽略__MACOSX,如你所说。
  • -x "*/\.*":忽略任何隐藏文件,例如.DS_Store。
  • 引用变量以避免文件,如果它以SPACE命名。

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

Github

答案 10 :(得分:1)

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

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

对于Finder的压缩命令,我不相信有任何选项可以控制它的行为。这是为了简单的案例。

另一个工具,也许是Finder实际使用的工具,是ditto。使用-c -k选项,它可以创建zip存档。使用此工具,您可以体验--norsrc--noextattr--noqtn--noacl和/或简单地取消--sequesterRsrc选项(根据手册页,可能负责__MACOSX子目录。虽然,也许缺少--sequesterRsrc只是意味着使用AppleDouble格式,这将在整个地方而不是一个__MACOSX目录中创建._文件。

答案 11 :(得分:1)

在阅读了所有现有答案后,我有了更好的解决方案。只需单击一下,工作流就可以完成所有工作。 其他软件,复杂的命令行内容和 NO shell技巧。

自动贩卖工作流程:

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

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

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

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

Sample

答案 12 :(得分: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

答案 13 :(得分: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特定文件(而不是先压缩然后删除)。

答案 14 :(得分:0)

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

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

演练:

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