
我有很多目錄,它們都是我創建的網頁腳本的演示,重要的是它們都共享資源。因此,我建立了一個全域資源目錄,並將該目錄符號連結到每個演示資料夾中。
我想要做的是將每個演示目錄壓縮到一個.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 上的人是否可以解壓縮存檔並使其正確呈現原始結構似乎取決於您使用誰或什麼來解壓縮它。
例如,大約一個月前,一家公司透過 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'
這些值在 /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
or--symlinks
才能將符號連結儲存在檔案中。
答案3
Zip 幫助內容如下:
-y 將符號連結儲存為連結而不是引用的文件