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就會看到
它們的時間都一樣,而且沒有更新。 值得注意的是,第二個欄位的資料從 1 變成了 2。 這個意思是說,這個檔案的實體有兩筆目錄資料。 簡化地說,這個檔案的實體有兩個名字。 如果我們更新這兩個名字之中的任何一個,例如說-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
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 的指標鏈結,保持其原來的名字。
不論指標鏈結所指向的目的地,是個普通檔案還是資料夾, 它自己總是一個普通檔案。所以可以如同普通檔案一樣地被複製、遷移和刪除, 甚至還可以再做另一個指標鏈結。
習題