我正在寻找一种在 macOS 上创建文件和文件夹的 zip 存档的方法,该方法满足以下要求:
__MACOSX
子目录)unzip -t
测试。如果可以使用内置工具完成则加分,但我也对第三方解决方案持开放态度。
许多 previous answers 建议解决方案应该是如下所示的
ditto
命令,这应该是 Archive Utility 本身在幕后使用的内容:
ditto -c -k --sequesterRsrc --keepParent src_directory archive.zip
这在某些时候可能是真的,但我怀疑它不再是 Archive Utility 使用的(从 macOS 13 Ventura 开始),因为,例如:
ditto
创建的大(> 4GB)zip 无法通过 unzip -t
测试(extra bytes at beginning or within zipfile
/ bad zipfile offset (local header sig)
),而使用 Archive Utility 或 Finder(右键单击 > Compress)创建的 zip 则没有这个问题。zipdetails
揭示了使用 ditto
与 Archive Utility 创建的 zip 之间的许多其他内部差异。 (例如,ditto
zip 报告 Created Zip Spec
为 15 '2.1'
,而 Archive Utility zip 报告 14 '2.0'
。)经过一些实验,似乎 Archive Utility zip 与
tar
创建的 zip 具有更多的内部相似性,例如:
tar --mac-metadata --format zip -cvf archive.zip -C src_parent_directory src_file_or_folder_name
也许并非巧合,
tar
也是 Apple 官方推荐从终端创建压缩文件存档(但仅适用于 tar 存档,不适用于 zip)。
问题是:
tar
创建的 zip 似乎没有正确保存 mac 元数据,这与 ditto
创建的 zip 不同,甚至与 tar
创建的 tars 不同。例如,与上面的命令不同,以下命令确实保留了 xattrs:
tar --mac-metadata -cvzf archive.tar -C src_parent_directory src_file_or_folder_name
但出于某种原因,它在创建 zip 时的行为方式不同,即使手册页中没有任何内容表明不支持此操作。 (我也试过
--mac-metadata
、--xattrs
和--acls
的各种组合,似乎没有任何区别。)
这似乎一定是可行的,因为 Archive Utility 能够做到。有人有建议吗?这位长期潜伏者首次发帖者将不胜感激。谢谢!
[编辑:已经一个多月了,还没有人回答……以防万一:我也会接受一个保留资源分叉和 xattrs 但不保留 acls 的解决方案。]
ditto -c -k --sequesterRsrc --keepParent src_directory archive.zip
满足要求 1 和 2,但不满足 3.
tar --mac-metadata --format zip -cvf archive.zip -C src_parent_directory src_file_or_folder_name
满足要求 1 和 3,但不满足 2.
zip -r archive.zip src_directory
满足要求 1 和 3,但不满足 2.
tar --mac-metadata -cvzf archive.tar -C src_parent_directory src_file_or_folder_name
满足要求 2,但不满足要求 1 或 3(因为结果不是 zip)
Archive Utility
和Finder right-click > Compress...
满足要求 2 和 3,但不符合要求 1.