Linux ln 命令

Linux 中的文件分為 Hard Link 和 Symbolic Link 兩種。Hard Link 文件又被稱為硬鏈接文件、實(shí)體鏈接文件,Symbolic Link 文件則常被稱為符號(hào)鏈接、軟鏈接文件。

ln 命令用來(lái)在文件之間建立鏈接。在介紹 ln 命令前,讓我們先來(lái)搞清楚究竟什么是硬鏈接,什么又是軟鏈接。

Hard Link(硬鏈接)

我們知道,在 Linux 系統(tǒng)中,每個(gè)文件對(duì)應(yīng)一個(gè) inode,文件的內(nèi)容在存儲(chǔ)在 inode 指向的 data block 中。要讀取該文件的內(nèi)容,需要通過(guò)文件所在的目錄中記錄的文件名找到文件的 inode 號(hào),然后通過(guò) inode 找到存儲(chǔ)文件內(nèi)容的 data block(參考《Linux 文件與目錄》https://www.cnblogs.com/sparkdev/p/11249659.html)。

也就是說(shuō),文件名存儲(chǔ)在目錄中,inode 號(hào)執(zhí)行文件存儲(chǔ)的內(nèi)容,文件名和 inode 之間有一個(gè)對(duì)應(yīng)關(guān)系。那么多個(gè)文件名可不可以同時(shí)指向同一個(gè) inode 呢?答案是可以的,這就是硬鏈接!從本質(zhì)上來(lái)說(shuō),硬鏈接只是在目錄下新添加了一個(gè)文件名,這個(gè)文件名與一個(gè)已有文件的 inode 相關(guān)聯(lián)。讓我們也通過(guò) /etc/crontab 文件來(lái)進(jìn)行觀察:

$ ll -i /etc/crontab
131213 -rw-r--r-- 1 root root 722 Nov 16  2017 /etc/crontab

使用 ln 命令在當(dāng)前目錄下創(chuàng)建一個(gè) /etc/crontab 文件的硬鏈接,然后觀察其文件屬性:

$ sudo ln /etc/crontab .
$ ll -i /etc/crontab crontab
131213 -rw-r--r-- 2 root root 722 Nov 16  2017 crontab
131213 -rw-r--r-- 2 root root 722 Nov 16  2017 /etc/crontab

這兩個(gè)文件名關(guān)聯(lián)的 inode 號(hào)完全相同,都是 131213,所以它們指向的是同一個(gè)文件。同時(shí)請(qǐng)注意文件屬性中的第三個(gè)字段,由 1 變成了 2。這個(gè)字段被稱為 "鏈接數(shù)",它說(shuō)明有多少個(gè)文件名鏈接到同一個(gè)文件的 inode。

另外需要注意的一點(diǎn)是上面所有輸出中的第二個(gè)字段中的第一位,它們都是 "-",它說(shuō)明這個(gè)文件的類型為普通文件,鏈接類型為硬鏈接。

我們可以通過(guò)下圖來(lái)理解硬鏈接在文件系統(tǒng)中的實(shí)現(xiàn)方式:

image

硬鏈接的特點(diǎn)

  • 幾乎不額外占用空間

  • 只要還有一個(gè)文件名引用著文件,文件就不會(huì)被真正刪除

由于硬鏈接只是在目錄中添加了一條包含文件名和 對(duì)應(yīng) inode 的記錄,所以它幾乎不會(huì)消耗額外的磁盤容量。

另外在刪除硬鏈接所關(guān)聯(lián)的文件時(shí),其實(shí)只是刪除了一條目錄中的記錄,真正的文件并不受影響。只有在刪除最后一個(gè)硬鏈接時(shí)才會(huì)真正刪除文件的內(nèi)容數(shù)據(jù)。

硬鏈接的局限性

  • 不能跨文件系統(tǒng)創(chuàng)建硬鏈接

  • 不能鏈接目錄

由于這兩個(gè)限制,實(shí)際使用中硬鏈接并沒(méi)有軟鏈接使用的廣泛,下面我們看看究竟什么是軟鏈接。

Symbolic Link(軟鏈接)

軟鏈接的實(shí)現(xiàn)方式與硬鏈接有本質(zhì)上的不同。創(chuàng)建軟鏈接時(shí)會(huì)創(chuàng)建一個(gè)新的文件(分配一個(gè) inode 和對(duì)應(yīng)的 data block),新文件的 data block 中存儲(chǔ)了目標(biāo)文件的路徑。
還拿 /etc/crontab 文件舉例子,這次創(chuàng)建一個(gè)軟鏈接并查看其文件屬性:

$ sudo ln -s /etc/crontab crontab2
image

第一列,兩個(gè)文件名對(duì)應(yīng)的 inode 不同,說(shuō)明這是兩個(gè)文件。

第二列顯示的文件權(quán)限也不一樣,這一點(diǎn)和硬鏈接完全不同。注意文件類型被標(biāo)記為 "l",說(shuō)明這是一個(gè)軟鏈接文件。

第三列很有意思,注意 /etc/crontab 文件的鏈接數(shù)量,還是 2,這和創(chuàng)建軟鏈接文件 crontab2 前是一樣的。也就是說(shuō)創(chuàng)建軟鏈接并不增加原文件的鏈接數(shù)。

第六列是文件大大小,注意新建的軟鏈接文件大小為 12 Bytes,也就是字符串 "/etc/crontab" 的長(zhǎng)度。

最后一列會(huì)友好的顯示出軟鏈接文件指向的源文件。
我們可以通過(guò)下圖來(lái)理解軟鏈接在文件系統(tǒng)中的實(shí)現(xiàn)方式:

image

從上圖我們可以看出,軟鏈接文件 crontab2 是一個(gè)實(shí)實(shí)在在的文件,有自己的 inode 和 data block。但是它的 data block 中保存的是目標(biāo)文件的地址:/etc/crontab。 像 open() 這樣的 API 能夠識(shí)別出軟鏈接,并根據(jù) data block 中的目標(biāo)文件徑把操作重定向到目標(biāo)文件上。

可以鏈接目錄是軟鏈接的一大優(yōu)勢(shì),創(chuàng)建目錄鏈接的方式和普通文件一樣:

$ ln -s /bin testbin

此時(shí)進(jìn)入 testbin 目錄和進(jìn)入 /bin 目錄是一樣的。

更厲害的是,還可以跨文件系統(tǒng)創(chuàng)建軟鏈接!

刪除源文件
對(duì)于軟鏈接來(lái)說(shuō),刪除源鏈接后,鏈接文件就會(huì)無(wú)法找到指向的源文件了??聪旅娴难菔荆?/p>

$ echo "hello world" > hello.txt
$ ln -s hello.txt hello2
$ cat hello2
hello world
$ rm hello.txt
$ cat hello2
cat: hello2: No such file or directory

刪除原文件后,操作鏈接文件時(shí)的提示是:"No such file or directory"。

文件的鏈接數(shù)

從上文中的示例我們可以看到,當(dāng)創(chuàng)建硬鏈接文件時(shí),文件的鏈接數(shù)會(huì)增加 1,而創(chuàng)建軟鏈接時(shí)文件的鏈接數(shù)卻不發(fā)生變化。

下面讓我們看一個(gè)目錄文件的鏈接數(shù),先創(chuàng)建一個(gè)空目錄:

$ mkdir /home/nick/testdir
$ ll  /home/nick | grep testdir
drwxr-xr-x  2 nick nick  4096 Jul 10 08:58 testdir/

新建的空目錄有兩個(gè)硬鏈接,分別是:

/home/nick/testdir
/home/nick/testdir/.

而 /home/nick/testdir 目錄下還有一個(gè)指向其父目錄的硬鏈接:/home/nick/testdir/..
也就是說(shuō)當(dāng)我們創(chuàng)建一個(gè)目錄時(shí),其父目錄的硬鏈接數(shù)會(huì)增加 1。

ln 命令

ln 命令用來(lái)在文件之間建立鏈接,其的常用方式為:

ln source target
ln -s source target

它們分別用來(lái)創(chuàng)建硬鏈接文件和軟鏈接文件。還有一個(gè)比較常用的選項(xiàng)是 f,它會(huì)強(qiáng)制刪除已經(jīng)存在的目標(biāo)文件。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Linux 中的文件分為 Hard Link 和 Symbolic Link 兩種。Hard Link 文件又被稱...
    7ee72f98ad17閱讀 193評(píng)論 0 1
  • 本文摘自:竹子-博客原文地址:http://www.cnblogs.com/peida/archive/2012/...
    嘿喵heyMeow閱讀 333評(píng)論 0 1
  • Linux ln 命令 Intro Linux 中的文件分為 Hard Link 和 Symbolic Link ...
    天天向上卡索閱讀 647評(píng)論 0 1
  • Linux ln命令是一個(gè)非常重要命令,它的功能是為某一個(gè)文件在另外一個(gè)位置建立一個(gè)同步的鏈接。 當(dāng)我們需要在不同...
    54c1eca7148a閱讀 359評(píng)論 0 1
  • 真的真的好想吐槽,在新疆的這幾天,沒(méi)吃過(guò)一頓好吃的。 或許是團(tuán)餐不好吃,或許是時(shí)間太匆忙,沒(méi)找到特色美食,但真的是...
    愛(ài)吃榴蓮的小丸子閱讀 536評(píng)論 6 2

友情鏈接更多精彩內(nèi)容