UNIX 檔案系統教材:檔案的鏈結

UNIX 的檔案鏈結觀念有兩種:實體鏈結 (hard link) 和指標鏈結 (symbolic link)。 實體鏈結只能在同一個磁碟區中執行,因為它是對磁碟空間內的一個檔案實體, 在資料夾內建立多於一個目錄資料。 實體鏈結 (link) 的指令是 ln。 假設 FA 是在目前資料夾內的普通檔案。

ln FA FB
就是要將 FB 作為檔案 FA 的鏈結。 FA 這個檔案原先所佔的磁碟空間並無改變, 增加一個 FB 也只是在目前的資料夾目錄資料中添上一筆資料, 所以實際上多用的磁碟空間非常之少。 注意,如果 FB 已經存在,通常 ln 不會詢問您是否確定要覆蓋原來的 FB。 請非常小心。如果希望 ln 必然詢問你,可以下指令
ln -n FA FB

如果 FOLDER 是一個資料夾 (可以含有路徑),則

ln FA FOLDER/FB
表示要在 FOLDER 裡面建立 FA 的鏈結,並命名為 FB。但是
ln FA FOLDER
表示要在 FOLDER 裡面建立 FA 的鏈結,保持它原來的名字 FA。反之,
ln FOLDER/FA FB
表示要在目前的資料夾內建立 FOLDER/FA 的鏈結,並命名為 FB。但是
ln FOLDER/FA .
表示要在目前的資料夾內建立 FOLDER/FA 的鏈結,保持它原來的名字 FA。

如果 FOLDONE 和 FOLDTWO 是兩個資料夾,則

ln FOLDONE/FA FOLDTWO/FB
或者
ln FOLDONE/FA FOLDTWO
都是很容易理解的鏈結方式。

以上所說的資料夾和檔案,都假設坐落在同一個磁碟區內。

互為實體鏈結的檔案內容與其目錄資料,將會完全一致。例如 test.txt 原來的目錄資料是

-rw-r--r--   1 shawn    special       30 Oct 26 19:10 test.txt
如果執行了
ln test.txt aa
再說
dir test.txt aa
就會看到
-rw-r--r--   2 shawn    special       30 Oct 26 19:10 aa
-rw-r--r--   2 shawn    special       30 Oct 26 19:10 test.txt
它們的時間都一樣,而且沒有更新。 值得注意的是,第二個欄位的資料從 1 變成了 2。 這個意思是說,這個檔案的實體有兩筆目錄資料。 簡化地說,這個檔案的實體有兩個名字。 如果我們更新這兩個名字之中的任何一個,例如說
touch aa
則另外一個也跟著改變,例如
-rw-r--r--   2 shawn    special       30 Oct 26 20:31 aa
-rw-r--r--   2 shawn    special       30 Oct 26 20:31 test.txt

如果刪除了一個互為實體鏈結的檔案名,並不會真的刪除那個檔案的實體。 但是,如果所有互為實體鏈結的檔案名都被刪除了, 那個檔案的實體也就從磁碟上移除了。

資料夾,或是坐落在不同磁碟區內的普通檔案,都不能做實體鏈結, 只能做指標鏈結。指令是 ln -s。 所謂指標鏈結,就是在磁碟上真的要佔用一塊空間, 用來儲存一個指標,指向另一個檔案或資料夾。 用 ls -F 列出檔案目錄的時候,指標鏈結檔案名的後面會添一個 @ 符號。 用 ls -l 列出詳細的檔案目錄的時候, 指標鏈結檔案名的後面會有一個 -> 記號, 跟著寫指去的目的地。例如

lrwxrwxrwx   1 shawn    special        8 Oct 26 20:52 test -> test.txt
能做實體鏈結的情況,也都能做指標鏈結。

如果 FOLDER 是一個資料夾,則可以說

ln -s FOLDER FOB
如果 FOB 已經存在,而且是個普通檔案,則 ln 會執行失敗。 如果 FOB 不存在,則會以 FOB 之名,建立一個 FOLDER 的指標鏈結。 如果 FOB 已經存在,而且是個資料夾,則會在 FOB 裡面建立一個 FOLDER 的指標鏈結,保持其原來的名字。

不論指標鏈結所指向的目的地,是個普通檔案還是資料夾, 它自己總是一個普通檔案。所以可以如同普通檔案一樣地被複製、遷移和刪除, 甚至還可以再做另一個指標鏈結。

習題

[BCC16-A]
單維彰 (2000/10/26) ---
[Prev] [Next] [Up]