我有许多目录,它们都是我创建的 Web 脚本的演示,重要的是它们都共享资源。因此,我创建了一个全局资源目录,并将该目录符号链接到每个演示文件夹。
我想要做的是将每个演示目录压缩成一个.zip
文件,我遇到的问题是符号链接在 zip 文件中维护,而在另一台机器上资源目录根本不存在。
有没有办法将演示文件夹压缩起来并解析所有符号链接,以便解压后的文件看起来就像标准文件结构的一部分?
非常感谢 :-)
答案1
几个问题:1)您正在存档的文件夹结构是否在内部使用符号链接来节省空间?(“内部”是指,给定一个特定的根文件夹,该根文件夹内的符号链接是否仅引用该文件夹内的其他文件或目录?)。
2)如何在 OS X 中创建 .zip 存档?(使用命令行工具,如果是,使用哪一个,或者使用 Archive Utility 等)
3) 目标计算机(将在其中解压档案)运行的是什么操作系统,以及您使用什么方法在那里解压文件?
首先,在 OS X 中,符号链接基本上是纯文本文件,其中包含一些额外的“Mac”信息,这些信息让 OS X 知道它应该将该文件视为符号链接。这些额外的 Mac 信息是特殊的文件类型、创建者代码和 Finder 标志信息,这些信息不是存储在文件本身中,而是存储在 HFS+ 磁盘目录中。
在 OS X 中,当您创建 .zip 文件时,zip 流中没有空间容纳这些额外的 Mac 信息,因此,从某种意义上说,符号链接作为纯文件存储在 zip 文件中。另一台 Mac 上的某个人是否可以解压缩档案并使其正确呈现原始结构似乎取决于您使用谁或什么来解压缩它。
例如,大约一个月前,一家公司通过 Steam(Valve 的游戏分发软件)发布了一款游戏。该游戏应用程序包以框架的形式包含 NVIDIA 的 Cg 库,该库在内部使用符号链接。最初 Steam 无法正确恢复 Trine.app 上的必要 Mac 信息,如以下帖子中所述: http://forums.steampowered.com/forums/showthread.php?t=1556083
下图显示了 Cg.framework 的两个不同副本,一个是我从 NVIDIA 网站单独安装的(上图),下图显示了随游戏一起收到的内容:
请注意,所有项目都匹配,但应该是符号链接的却是纯数据文件。
仔细查看了这两个项目的 FSCatalogInfo 记录后,我很清楚问题是什么:
您会注意到上图中 finderInfo 结构的开头具有以下值:
0x736C6E6B = 'slnk'
0x72686170 = 'rhap'
这些值在 /usr/include/hfs/hfs_format.h 中定义:
/*
* File type and creator for symbolic links
*/
enum {
kSymLinkFileType = 0x736C6E6B, /* 'slnk' */
kSymLinkCreator = 0x72686170 /* 'rhap' */
};
第 9 个字节值 0x80 对应于kIsAlias
的标志finderInfo.finderFlags
。该值在 /System/Library/Frameworks/CoreServices.framework/.../CarbonCore.framework/.../Headers/Finder.h 中定义:
enum {
kIsAlias = 0x8000 /* Files only */
};
看来 OS X(存档实用程序)内置的解压缩功能是硬编码的,用于在正在解压缩的存档中查找可能代表符号链接的文件,并适当地设置信息。我相信/usr/bin/ditto
(当用于存档文件时)也能为您处理这个问题。我不确定是否zip
这样unzip
做。
答案2
这是 Info-ZIP 的默认行为zip
。您需要传递-y
或--symlinks
才能将符号链接存储在档案中。
答案3
Zip 帮助内容如下:
-y 将符号链接存储为链接而不是引用的文件