懶人版"一天"一個(gè)Linux命令之ln

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

ln 命令用來在文件之間建立鏈接窥翩。在介紹 ln 命令前,讓我們先來搞清楚究竟什么是硬鏈接鳞仙,什么又是軟鏈接寇蚊。

Hard Link(硬鏈接)

我們知道,在 Linux 系統(tǒng)中棍好,每個(gè)文件對(duì)應(yīng)一個(gè) inode仗岸,文件的內(nèi)容在存儲(chǔ)在 inode 指向的 data block 中。要讀取該文件的內(nèi)容借笙,需要通過文件所在的目錄中記錄的文件名找到文件的 inode 號(hào)扒怖,然后通過 inode 找到存儲(chǔ)文件內(nèi)容的 data block。

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

$ ll -i /etc/crontab131213 -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 crontab131213 -rw-r--r-- 2 root root 722 Nov 16  2017 crontab131213 -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ù)"琴拧,它說明有多少個(gè)文件名鏈接到同一個(gè)文件的 inode。

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

我們可以通過下圖來理解硬鏈接在文件系統(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í)際使用中硬鏈接并沒有軟鏈接使用的廣泛,下面我們看看究竟什么是軟鏈接风罩。

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 不同廓俭,說明這是兩個(gè)文件。

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

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

第六列是文件大大小继谚,注意新建的軟鏈接文件大小為 12 Bytes烈菌,也就是字符串 "/etc/crontab" 的長度。

最后一列會(huì)友好的顯示出軟鏈接文件指向的源文件花履。

我們可以通過下圖來理解軟鏈接在文件系統(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)勢旺矾,創(chuàng)建目錄鏈接的方式和普通文件一樣:

$ ln -s /bin testbin

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

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

刪除源文件

對(duì)于軟鏈接來說举反,刪除源鏈接后,鏈接文件就會(huì)無法找到指向的源文件了扒吁』鸨牵看下面的演示:

$ echo "hello world" > hello.txt$ ln -s hello.txt hello2$ cat hello2hello world$ rm hello.txt$ cat hello2cat: 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 testdirdrwxr-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/..

也就是說當(dāng)我們創(chuàng)建一個(gè)目錄時(shí)鹏控,其父目錄的硬鏈接數(shù)會(huì)增加 1。

ln 命令

ln 命令用來在文件之間建立鏈接肤寝,其的常用方式為:

ln source target
ln -s source target

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

文章轉(zhuǎn)載于良許Linux微信公眾號(hào)缘揪,有興趣的小伙伴可以關(guān)注一下!
https://mp.weixin.qq.com/s/qSb0OqJX3UEGt4nLRNwgDw

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末义桂,一起剝皮案震驚了整個(gè)濱河市找筝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慷吊,老刑警劉巖袖裕,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異溉瓶,居然都是意外死亡急鳄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門嚷闭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攒岛,“玉大人,你說我怎么就攤上這事胞锰≡志猓” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵嗅榕,是天一觀的道長顺饮。 經(jīng)常有香客問我吵聪,道長,這世上最難降的妖魔是什么兼雄? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任吟逝,我火速辦了婚禮,結(jié)果婚禮上赦肋,老公的妹妹穿的比我還像新娘块攒。我一直安慰自己,他們只是感情好佃乘,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布囱井。 她就那樣靜靜地躺著,像睡著了一般趣避。 火紅的嫁衣襯著肌膚如雪庞呕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天程帕,我揣著相機(jī)與錄音住练,去河邊找鬼。 笑死愁拭,一個(gè)胖子當(dāng)著我的面吹牛讲逛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敛苇,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼妆绞,長吁一口氣:“原來是場噩夢啊……” “哼顺呕!你這毒婦竟也來了枫攀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤株茶,失蹤者是張志新(化名)和其女友劉穎来涨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體启盛,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹦掐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了僵闯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卧抗。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鳖粟,靈堂內(nèi)的尸體忽然破棺而出社裆,到底是詐尸還是另有隱情,我是刑警寧澤向图,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布泳秀,位于F島的核電站标沪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嗜傅。R本人自食惡果不足惜金句,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吕嘀。 院中可真熱鬧违寞,春花似錦、人聲如沸偶房。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝴悉。三九已至彰阴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拍冠,已是汗流浹背尿这。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庆杜,地道東北人射众。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像晃财,于是被迫代替她去往敵國和親叨橱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容