Linux中的ln 建立鏈結

2021-07-30 13:29:37 字數 4736 閱讀 4836

建立硬鏈結 ln file link,和建立符號鏈結 ln -s item link,「item」是乙個檔案或者是乙個目錄。

硬鏈結

硬鏈結和符號鏈結比起來,硬鏈結是最初unix 建立鏈結的方式,而符號鏈結更加現代。在預設情況下,每個檔案有乙個硬鏈結,這個硬鏈結給檔案起名字。當我們建立乙個硬鏈結以後,就為檔案建立了乙個額外的目錄條目。硬鏈結有兩個重要侷限性:

1. 乙個硬鏈結不能關聯它所在檔案系統之外的檔案。這是說乙個鏈結不能關聯與鏈結本身不在同乙個磁碟分割槽上的檔案。

2. 乙個硬鏈結不能關聯乙個目錄。

乙個硬鏈結和檔案本身沒有什麼區別。不像符號鏈結,當你列出乙個包含硬鏈結的目錄內容時,你會看到沒有特殊的鏈結指示說明。當乙個硬鏈結被刪除時,這個鏈結被刪除,但是檔案本身的內容仍然存在(這是說,它所佔的磁碟空間不會被重新分配),直到所有關聯這個檔案的鏈結都刪除掉。知道硬鏈結很重要,因為你可能有時會遇到它們,但現在實際中更喜歡使用符號鏈結,下一步我們會討論符號鏈結。

符號鏈結

建立符號鏈結是為了克服硬鏈結的侷限性。符號鏈結生效,是通過建立乙個特殊型別的檔案,這個檔案包含乙個關聯檔案或目錄的文字指標。在這一方面,它們和 windows 的快捷方式差不多,當然,符號鏈結早於 windows 的快捷方式很多年。乙個符號鏈結指向乙個檔案,而且這個符號鏈結本身與其它的符號鏈結幾乎沒有區別。例如,如果你往乙個符號鏈結裡面寫入東西,那麼相關聯的檔案也被寫入。然而,當你刪除乙個符號鏈結時,只有這個鏈結被刪除,而不是檔案自身。如果先於符號鏈結刪除檔案,這個鏈結仍然存在,但是不指向任何東西。在這種情況下,這個鏈結被稱為壞鏈結。在許多實現中,ls命令會以不同的顏色展示壞鏈結,比如說紅色,來顯示它們的存在。關於鏈結的概念,看起來很迷惑,但不要膽怯。我們將要試著練習這些命令,希望,它變得清晰起來。

下面來看乙個例子,首先在家目錄裡建立乙個叫做「playground」的目錄。

建立目錄:[me@linuxbox ~]$ mkdir playground

在playground 目錄下建立一對目錄,分別叫做「dir1」和「dir2」。更改我們的當前工作目錄到playground,然後執行mkdir 命令:

[me@linuxbox ~]$ cd playground

[me@linuxbox playground]$ mkdir dir1 dir2

在 playground 目錄中建立乙個fun檔案和乙個fun 目錄:[me@linuxbox playground]$ mkdir fun

建立硬鏈結

[me@linuxbox playground]$ ln fun fun-hard

[me@linuxbox playground]$ ln fun dir1/fun-hard

[me@linuxbox playground]$ ln fun dir2/fun-hard

所以現在,我們有四個檔案「fun」 的例項。看一下目錄playground 中的內容:

[me@linuxbox playground]$ ls -l

total 16

drwxrwxr-x 2 me me 4096 2008-01-14 16:17 dir1

drwxrwxr-x 2 me me 4096 2008-01-14 16:17 dir2

-rw-r--r-- 4 me me 1650 2008-01-10 16:33 fun

-rw-r--r-- 4 me me 1650 2008-01-10 16:33 fun-hard

注意到一件事,列表中,檔案fun 和fun-hard 的第二個欄位是「4」,這個數字是檔案「fun」的硬鏈結數目。你要記得乙個檔案至少有乙個硬鏈結,因為檔名就是由鏈結建立的。所以,我們怎樣知道實際上fun 和fun-hard 是一樣的檔案呢?在這個例子裡,ls 不是很有用。雖然我們能夠看到fun 和fun-hard 檔案大小一樣(第五字段),但我們的列表沒有提供可靠的資訊來確定(這兩個檔案一樣)。為了解決這個問題,我們更深入的研究一下。當考慮到硬鏈結的時候,我們可以假設檔案由兩部分組成:包含檔案內容的資料部分和持

有檔名的名字部分,這將有助於我們理解這個概念。當我們建立檔案硬鏈結的時候,實際上是為檔案建立了額外的名字部分,並且這些名字都關係到相同的資料部分。這時系統會分配一連串的磁碟給所謂的索引節點,然後索引節點與檔案名字部分相關聯。因此每乙個硬鏈結都關係到乙個具體的包含檔案內容的索引節點。ls 命令有一種方法,來展示(檔案索引節點)的資訊。在命令中加上「-i」 選項:

[me@linuxbox playground]$ ls -li

total 16

12353539 drwxrwxr-x 2 me me 4096 2008-01-14 16:17 dir1

12353540 drwxrwxr-x 2 me me 4096 2008-01-14 16:17 dir2

12353538 -rw-r--r-- 4 me me 1650 2008-01-10 16:33 fun

12353538 -rw-r--r-- 4 me me 1650 2008-01-10 16:33 fun-hard

在這個版本的列表中,第一字段表示檔案索引節點號,正如我們所見到的,fun 和fun-hard 共享一樣的索引節點號,這就證實這兩個檔案是一樣的檔案。

建立符號鏈結

[me@linuxbox playground]$ ln -s fun fun-sym

[me@linuxbox playground]$ ln -s ../fun dir1/fun-sym

[me@linuxbox playground]$ ln -s ../fun dir2/fun-sym

第乙個例項相當直接,在ln 命令中,簡單地加上「-s」 選項就可以建立乙個符號鏈結,而不是乙個硬鏈結。下面兩個例子又是怎樣呢?記住,當我們建立乙個符號鏈結的時候,會建立乙個目標檔案在**和符號鏈結有關聯的文字描述。如果我們看看ls 命令的輸出結果,比較容易理解。

[me@linuxbox playground]$ ls -l dir1

total 4

-rw-r--r-- 4 me me 1650 2008-01-10 16:33 fun-hard

lrwxrwxrwx 1 me me 6 2008-01-15 15:17 fun-sym -> ../fun

目錄dir1 中,fun-sym 的列表說明了它是乙個符號鏈結,通過在第一欄位中的首字元「l」可知,並且它還指向「../fun」,也是正確的。相對於fun-sym 的儲存位置,fun 在它的上乙個目錄。同時注意,符號鏈結檔案的長度是6,這是字串「../fun」 所包含的字元數,而不是符號鏈結所指向的檔案長度。

當建立符號鏈結時,你即可以使用絕對路徑名:

ln -s /home/me/playground/fun dir1/fun-sym

[me@linuxbox playground]$ ln -s dir1 dir1-sym

[me@linuxbox playground]$ ls -l

total 16

... 省略

移動檔案和目錄

[me@linuxbox playground]$ rm fun-hard

[me@linuxbox playground]$ ls -l

total 12

... 省略

結果不出所料。檔案fun-hard 消失了,檔案fun 的鏈結數從4 減到3,正如目錄列表第二字段所示。下一步,我們會刪除檔案fun,僅為了娛樂,我們會包含「-i」 選項,看乙個它的作用:

[me@linuxbox playground]$ rm -i fun

rm: remove regular file `fun'?

[me@linuxbox playground]$ ls -l

total 8

drwxrwxr-x 2 me me 4096 2008-01-15 15:17 dir1

lrwxrwxrwx 1 me me 4 2008-01-16 14:45 dir1-sym -> dir1

drwxrwxr-x 2 me me 4096 2008-01-15 15:17 dir2

lrwxrwxrwx 1 me me 3 2008-01-15 15:15 fun-sym -> fun

大多數linux 的發行版本配置ls 顯示損壞的鏈結。在fedora 系統中,壞的鏈結以閃爍的紅色文字顯示!損壞鏈結的出現,並不危險,但是相當混亂。如果我們試著使用損壞的鏈結,會看到以下情況:

[me@linuxbox playground]$ less fun-sym

fun-sym: no such file or directory

[me@linuxbox playground]$ rm fun-sym dir1-sym

[me@linuxbox playground]$ ls -l

total 8

drwxrwxr-x 2 me me 4096 2008-01-15 15:17 dir1

drwxrwxr-x 2 me me 4096 2008-01-15 15:17 dir2

對於符號鏈結,有一點值得記住,執行的大多數檔案操作是針對鏈結的物件,而不是鏈結本身。而rm 命令是個特例。當你刪除鏈結的時候,刪除鏈結本身,而不是鏈結的物件。最後,我們將刪除 playground。為了完成這個工作,我們將返回到我們的家目錄,然後用rm 命令加上選項(-r),來刪除目錄playground,和目錄下的所有內容,包括子目錄:

[me@linuxbox playground]$ cd

[me@linuxbox ~]$ rm -r playground

ln 建立鏈結

ln命令用來為檔案創件連線,連線型別分為硬連線和符號連線兩種,預設的連線型別是硬連線。如果要建立符號連線必須使用 s 選項。ln 選項 引數 b或 backup 刪除,覆蓋目標檔案之前的備份 d或 f或 directory 建立目錄的硬連線 f或 force 強行建立檔案或目錄的連線,不 件或目錄是...

linux 鏈結ln命令

linux中鏈結命令ln是乙個非常重要的命令 linux中鏈結方式又分為硬鏈結和軟鏈結 又稱之為符號鏈結 兩種 首先介紹下ln命令 l n命令用來連線檔案或目錄,如同時指定兩個以上的檔案或目錄,且最後的目的地是乙個已經存在的目錄,則會把前面指定的所有檔案或目錄複製到該目錄中。若同時指定多個檔案或目錄...

Linux鏈結檔案ln

硬鏈結特徵 ln 1.擁有相同的i節點和儲存block快,可以看做是同乙個檔案 2.可通過i節點識別 3.不能跨分割槽 4.不能針對目錄使用,僅對檔案有效 軟鏈結特徵 ln s 1.類似windows的快捷方式 2.軟鏈結擁有自己的i節點和block塊,但是資料塊中只儲存原檔案的檔名和i節點號,並沒...