##軟連接: 也叫符號連接,實際上就是windows之中的快捷方式,軟鏈接是一個文件,這個文件保存這目標文件完整路徑。因此建立軟鏈接的時候目標文件必定輸入完整路徑。不然你將軟鏈接文件移動到別的地方就很差用了。 建立軟鏈接命令:node
<!-- lang: shell --> ln -s /home/myhome/vim/vimrc /home/myhome/.vimrc #-s選項表示建立符號鏈接
此外你徹底能夠建立一個目標文件不存在的軟鏈接,以做爲特殊用途。shell
##硬連接: 相對於軟鏈接,硬連接要複雜的多。在瞭解硬連接前,首先須要知道inode的概念。編程
inode 是 UNIX 操做系統中的一種數據結構,其本質是結構體,它包含了與文件系統中各個文件相關的一些重要信息。在 UNIX 中建立文件系統時,同時將會建立大量的 inode 。一般,文件系統磁盤空間中大約百分之一空間分配給了 inode 表。vim
咱們都知道,磁盤是將文件分割成許多塊,放到由扇區(sector,512字節)組成的塊(block,通常爲4mb)之中。而爲了快速查找文件,必須有索引來指示那個文件的第一塊的位置。這就是inode的做用之一。 在Linux當中,最多見的就是EXT系列文件系統,它們的inode組成大體以下:windows
其次是目錄項。Linux中全部的目錄都被視爲文件,內容是他所包含的文件的文件名和對應inode。特別的,對於根目錄,每個分區都包含一個磁道組信息。根分區也不例外,根分區的 Cylinder Group Blocks裏面也包含了根分區的inodes數據,其中包含了根的inode編號。 Linux查找一個文件,例如/home/wgj/ak47.txt,假設咱們未對/home獨立分區。 那麼系統首先讀取分區的頭部分,得到根目錄的inode值,而後獲得根目錄文件的內容,查找wgj目錄,獲取其inode值,遞歸下去,直到找到ak47.txt的inode值爲止。數據結構
瞭解了這個過程,硬連接就不難理解了:實際上全部的你見到的文件都是硬連接。添加一個硬連接實際上就是在目錄文件中添加一個文件名和inode值的key-value對。操作系統
這樣就能夠理解硬連接的一些特性了,例如不佔用inode值(只是對目錄文件的修改),沒法跨分區建立硬連接(分區不一樣,inode值多是同樣的),刪除源文件,不影響硬連接。(inode值未丟失。還有至少一個)code
學過JAVA編程的能夠這麼理解,硬連接就至關於變量的引用,一個對象能夠有多個引用。若是沒有引用指向這個對象,那就能夠回收了。因此對於垃圾文件或者非重要文件不要創建硬連接,要否則你刪除的時候還要找它全部的硬連接Orz。對象
建立硬連接(無需完整路徑):遞歸
<!-- lang: shell --> ln ak47.txt ak48.txt
##軟連接和硬連接的場景
##關於硬連接目錄和軟連接目錄 根據ln的man page,Linux使能夠創建目錄的硬連接的,可是須要root權限。這麼作的緣由是爲了防止環的存在。例若有一個目錄A,如今創建一個目錄A的硬連接,添加到A當中,做爲A的子文件夾,那麼遞歸搜索的時候,就會造成一個環,進入死循環。若是要防止這種狀況發生,那麼就必須將訪問過的目錄儲存在內存中,而後每訪問一個文件都檢查一下是否已經訪問過了。這個過程對於系統來講,不管是時間複雜度和空間複雜度都是沒法接受的。因此原則上並不建議爲目錄創建硬連接,雖然這對於系統來講並非很麻煩。
可是軟連接卻不存在上述問題。對於系統來講,軟鏈接數目相對較少,並且識別一個文件是軟連接的成本很低,所能以較小的代價在內存中創建一個軟連接的樹或者散列。因此當存在軟鏈接目錄環的時候就能夠十分方便的判斷。