当我在 Mac OSX 中使用内置 zip 压缩器压缩文件时,它会导致在提取的 zip 中创建一个名为“__MACOSX”的额外文件夹。
我可以调整我的设置以防止创建此文件夹还是需要购买第三方压缩工具?
更新:我刚刚找到了一个 OSX 的免费软件应用程序,可以解决我的问题:“ YemuZip ”
更新 2:YemuZip 不再是免费软件。
事后可以通过以下方式修复zip -d filename.zip __MACOSX/\*
当我遇到这个问题时,我已经从命令行完成了:
zip file.zip uncompressed
编辑,经过多次否决:我之前使用过这个选项,我不知道我在哪里学到的,所以我不能给你更好的解释。克里斯约翰逊的回答是正确的,但我不会删除我的。正如一条评论所说,它对 OP 的要求更准确,因为它在没有这些文件的情况下进行压缩,而不是从压缩文件中删除它们。我也觉得更容易记住。
在要压缩的文件夹中,在终端中:
zip -r -X Archive.zip *
其中-X表示:排除“_MACOSX”或“._Filename”等不可见的Mac资源文件和.ds存储文件
注意:仅适用于您所在的文件夹和后续文件夹树,并且必须具有*
通配符。
这个命令为我做了:
zip -r Target.zip Source -x "*.DS_Store"
Target.zip
是要创建的 zip 文件。Source
是要压缩的源文件/文件夹。并且-x
参数指定要排除的文件/文件夹。如果上述方法由于某种原因不起作用,请尝试以下方法:
zip -r Target.zip Source -x "*.DS_Store" -x "__MACOSX"
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
-x "*/\__MACOSX"
:忽略你提到的__MACOSX。-x "*/\.*"
:忽略任何隐藏文件,例如 .DS_Store 。此外,您可以构建 Automator Service 以使其在 Finder 中轻松使用。如果需要,请查看下面的链接以查看详细信息。
也可以通过以下方式删除不需要的文件夹:
zip -d filename.zip "__MACOSX*"
最适合我
命令行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
and 7z
,但不是存档实用程序、Unarchiverunar
或dtrx
)不会为提取档案时的文件,这通常会使文件难以找到,并且如果同时提取多个类似的档案,则可能很难分辨哪些文件属于哪个档案。
存档实用程序仅__MACOSX
在您创建至少一个文件包含元数据(例如扩展属性、文件标志或资源分支)的存档时创建目录。该目录包含文件名以用于存储 OS X 特定元数据的__MACOSX
AppleDouble 文件。._
命令行zip
实用程序会丢弃扩展属性、文件标志和资源分支等元数据,这也意味着标签等元数据会丢失,并且别名停止工作,因为别名文件中的信息存储在资源分支中。
通常您可以丢弃特定于 OS X 的元数据,但要查看元数据文件包含哪些内容,您可以使用xattr -l
. xattr
还包括资源分叉和文件标志,因为即使它们实际上并未存储为扩展属性,也可以通过扩展属性接口访问它们。存档实用程序和zip
命令行实用程序都会丢弃 ACL。
你不能。
但是您可以做的是在压缩后删除那些不需要的文件夹。命令行zip
采用不同的参数,其中一个 ,-d
用于删除基于正则表达式的内容。所以你可以像这样使用它:
zip -d filename.zip __MACOSX/\*
清理 .zip.DS_Store
和__MACOSX
,包括子文件夹:
zip -d archive.zip '__MACOSX/*' '*/__MACOSX/*' .DS_Store '*/.DS_Store'
演练:
zip
(但不要按回车键)-d '__MACOSX/*' '*/__MACOSX/*' .DS_Store '*/.DS_Store'
zipinfo archive.zip
列出里面的文件,检查(可选)不要压缩任何隐藏文件:
zip newzipname filename.any -x "\.*"
带着这个问题,应该是这样的:
zip newzipname filename.any -x "\__MACOSX"
必须说,虽然 zip 命令在终端中运行只是压缩文件,它不会压缩任何其他文件。所以这样做结果是一样的:
zip newzipname filename.any
阅读所有现有答案后,我有一个更好的解决方案。只需单击鼠标右键,一切都可以通过工作流程完成。 没有额外的软件,没有复杂的命令行内容,也没有shell 技巧。
自动化工作流程:
第二步:运行Shell命令,输入参数。复制下面的命令。
zip -d "$@" "__MACOSX/*" || true
zip -d "$@" "*/.DS_Store" || true
保存它,我们就完成了!只需右键单击文件夹或大量文件,然后从服务菜单中选择工作流程。将同时创建没有元数据的存档。
您是指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
目录。
这就是我在使用命令__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
可以与 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 特定文件(而不是先压缩后删除)。