在 OSX 中压缩文件,想要“解析”符号链接

Ben*_*ard 3 symbolic-link osx-snow-leopard macos

我有许多目录,它们都是我创建的 Web 脚本的演示,重要的是它们都共享资源。因此,我创建了一个全局资源目录,并将该目录象征性地链接到每个演示文件夹中。

我想要做的是将每个演示目录压缩到一个.zip文件中,我遇到的问题是符号链接保存在 zip 文件中,而在另一台机器上,资源目录根本不存在。

有没有办法压缩演示文件夹并解析任何符号链接,以便解压缩文件时看起来好像它们是标准文件结构的一部分?

非常感谢 :-)

NSG*_*God 7

几个问题:1) 您归档的文件夹结构是否在内部使用符号链接来节省空间?(“内部”,我的意思是,给定一个特定的根文件夹,该根文件夹中的符号链接是否只引用也在该文件夹中的其他文件或目录?)。

2) 你是如何在 OS X 中创建 .zip 档案的?(使用命令行工具,如果是,使用哪个,或使用 Archive Utility 等)

3) 目标计算机(将在其中解压缩存档)运行的是什么操作系统,您使用什么方法在那里解压缩文件?

首先,在 OS X 中,符号链接基本上是纯文本文件,带有一些额外的“Mac”信息,让 OS X 知道它应该将文件视为符号链接。这个额外的 Mac 信息是一种特殊的文件类型、创建者代码和 Finder 标志信息,这些信息不是存储在文件本身中,而是存储在 HFS+ 磁盘目录中。

在 OS X 中,当您创建 .zip 文件时,zip 流中没有空间容纳这些额外的 Mac 信息,因此,从某种意义上说,符号链接作为纯文件存储在 zip 文件中。另一台 Mac 上的某个人是否可以解压缩存档并使其正确代表原始结构似乎取决于您使用谁或什么来解压缩它。

例如,大约一个月前,一家公司通过 Valve 的游戏分发软件 Steam 发布了一款游戏。游戏应用程序包以框架的形式包含 NVIDIA 的 Cg 库,该库在内部使用符号链接。Steam 最初存在一个问题,如此线程中所述,无法在 Trine.app 上正确恢复必要的 Mac 信息:http ://forums.steampowered.com/forums/showthread.php?t=1556083

下图显示了 Cg.framework 的 2 个不同副本,一个是我从 NVIDIA 网站单独安装的(上图),下图显示了游戏收到的内容:

替代文字

请注意,所有项目都匹配,但符号链接应该是纯数据文件。

在仔细查看这两个项目的 FSCatalogInfo 记录后,我很清楚问题是什么:

替代文字

您会在上图中注意到 finderInfo 结构的开头具有以下值:

0x736C6E6B = 'slnk'
0x72686170 = 'rhap'
Run Code Online (Sandbox Code Playgroud)

这些值在 /usr/include/hfs/hfs_format.h 中定义:

/*
 *  File type and creator for symbolic links
*/
enum {
    kSymLinkFileType  = 0x736C6E6B, /* 'slnk' */
    kSymLinkCreator   = 0x72686170  /* 'rhap' */
};
Run Code Online (Sandbox Code Playgroud)

第9字节值,0x80的,对应kIsAlias的标志finderInfo.finderFlags。该值在 /System/Library/Frameworks/CoreServices.framework/.../CarbonCore.framework/.../Headers/Finder.h 中定义:

enum {
    kIsAlias                      = 0x8000 /* Files only */
};
Run Code Online (Sandbox Code Playgroud)

似乎 OS X(存档实用程序)内置的解压缩功能是硬编码的,以在解压缩的存档中查找代表符号链接的可能文件,并适当地设置信息。我相信/usr/bin/ditto(当用于存档文件的能力时)也会为您解决这个问题。我不知道是否zip还是unzip这样做。


Ign*_*ams 6

这是 Info-ZIP 的默认行为zip。您需要传递-y--symlinks以便在存档中存储符号链接。