当我在Mac OSX中使用内置zip压缩器压缩文件时,会导致在提取的zip中创建一个名为“__MACOSX”的额外文件夹。
我可以调整设置以防止创建此文件夹,还是需要购买第三方压缩工具?
更新:我刚刚找到一个解决我问题的OSX免费软件:“YemuZip”
更新2 :YemuZip不再是免费软件
答案 0 :(得分:295)
可以在zip -d filename.zip __MACOSX/\*
答案 1 :(得分:69)
当我遇到这个问题时,我已经从命令行完成了它:
zip file.zip uncompressed
编辑:我之前使用过这个选项,我不知道在哪里学到它,所以我不能给你一个更好的解释。克里斯约翰逊的answer是正确的,但我不会删除我的。正如一条评论所说的那样,它对OP的要求更为准确,因为它在没有这些文件的情况下进行压缩,而不是从压缩文件中删除它们。我发现它也更容易记住。
答案 2 :(得分:47)
在您想要压缩的文件夹中,在终端:
zip -r -X Archive.zip *
其中-X表示:排除那些不可见的Mac资源文件,例如“_MACOSX”或“._Filename”和.ds存储文件
注意:仅适用于您所在的文件夹和后续文件夹树,并且必须包含*
通配符。
答案 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
答案 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存档的顶级文件通常应该是一个目录,因为如果不是,则会使用一些非存档实用程序(如unzip
和7z
,但不存档存档实用程序, Unarchiver,unar
或dtrx
)在提取存档时不会为文件创建包含目录,这通常会使文件难以找到,并且如果在同一个文件中提取多个这样的存档时间,可能很难分辨哪些文件属于哪个档案。
Archive Utility仅在创建存档时创建__MACOSX
目录,其中至少有一个文件包含元数据,如扩展属性,文件标志或资源分支。 __MACOSX
目录包含AppleDouble文件,其文件名以._
开头,用于存储特定于OS X的元数据。 zip
命令行实用程序会丢弃扩展属性,文件标志和资源分叉等元数据,这也意味着标记等元数据丢失,并且别名停止工作,因为别名文件中的信息存储在资源分叉。
通常,您可以放弃特定于操作系统X的元数据,但要查看哪些元数据文件包含,您可以使用xattr -l
。 xattr
还包括资源分支和文件标志,因为即使它们实际上并不存储为扩展属性,也可以通过扩展属性接口访问它们。 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。此外,您可以构建Automator服务,以便在Finder中轻松使用。 如果需要,请查看下面的链接以查看详细信息。
答案 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技巧。
自动贩卖工作流程:
步骤2:运行Shell命令,输入为参数。复制下面的命令。
zip -d "$@" "__MACOSX/*" || true
zip -d "$@" "*/.DS_Store" || true
保存它,我们完成了!只需右键单击文件夹或大量文件,然后从服务菜单中选择工作流程。将不会创建没有元数据的存档。
答案 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'
演练:
zip
(但不要按 Enter)-d '__MACOSX/*' '*/__MACOSX/*' .DS_Store '*/.DS_Store'
zipinfo archive.zip
列出里面的文件,检查(可选)