Linux上建立和更改硬連接和符號連接(軟鏈接)

Linux上建立和更改硬連接和符號連接(軟鏈接)

對於Linux上的硬連接和軟鏈接而言,使用cp命令,不管覆蓋其中的那個文件(源文件,軟鏈接文件,硬連接文件),其它文件的內容都會同步修改。

 
css


點擊(此處)摺疊或打開java

  1. [oracle@edsir4p1- ~]$ ll
  2. [oracle@edsir4p1- ~]$ touch a.txt
  3. [oracle@edsir4p1- ~]$ ln -s a.txt b.txt
  4. [oracle@edsir4p1- ~]$ ll
  5. -rw-r--r-- 1 oracle oinstall 0 Dec 4 12:32 a.txt
  6. lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
  7. [oracle@edsir4p1- ~]$ ln a.txt c.txt
  8. [oracle@edsir4p1- ~]$ ll
  9. -rw-r--r-- 2 oracle oinstall 0 Dec 4 12:32 a.txt
  10. lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
  11. -rw-r--r-- 2 oracle oinstall 0 Dec 4 12:32 c.txt
  12. [oracle@edsir4p1- ~]$ echo lhr > a.txt
  13. [oracle@edsir4p1- ~]$ more a.txt
  14. lhr
  15. [oracle@edsir4p1- ~]$
  16. [oracle@edsir4p1- ~]$ more a.txt
  17. lhr
  18. [oracle@edsir4p1- ~]$ more b.txt
  19. lhr
  20. [oracle@edsir4p1- ~]$ more c.txt
  21. lhr
  22. [oracle@edsir4p1- ~]$ echo lihuarong > b.txt
  23. [oracle@edsir4p1- ~]$ more a.txt
  24. lihuarong
  25. [oracle@edsir4p1- ~]$ more b.txt
  26. lihuarong
  27. [oracle@edsir4p1- ~]$ more c.txt
  28. lihuarong
  29. [oracle@edsir4p1- ~]$ echo best > d.txt
  30. [oracle@edsir4p1- ~]$
  31. [oracle@edsir4p1- ~]$
  32. [oracle@edsir4p1- ~]$ cp d.txt b.txt
  33. [oracle@edsir4p1- ~]$ ll *.txt
  34. -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 a.txt
  35. lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
  36. -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 c.txt
  37. -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
  38. [oracle@edsir4p1- ~]$ more a.txt
  39. best
  40. [oracle@edsir4p1- ~]$ more b.txt
  41. best
  42. [oracle@edsir4p1- ~]$ more c.txt
  43. best
  44. [oracle@edsir4p1- ~]$ more d.txt
  45. best
  46. [oracle@edsir4p1- ~]$ ls -i a.txt
  47. 46236787 a.txt
  48. [oracle@edsir4p1- ~]$ ls -li *.txt
  49. 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 a.txt
  50. 46236797 lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
  51. 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 c.txt
  52. 46236798 -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
  53. [oracle@edsir4p1- ~]$ echo xxxoooo > e.txt
  54. [oracle@edsir4p1- ~]$ ls -li *.txt
  55. 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 a.txt
  56. 46236797 lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
  57. 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 c.txt
  58. 46236798 -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
  59. 46236799 -rw-r--r-- 1 oracle oinstall 8 Dec 4 12:57 e.txt
  60. [oracle@edsir4p1- ~]$ cp b.txt b.txt_bk
  61. [oracle@edsir4p1- ~]$
  62. [oracle@edsir4p1- ~]$
  63. [oracle@edsir4p1- ~]$ cp e.txt b.txt
  64. [oracle@edsir4p1- ~]$
  65. [oracle@edsir4p1- ~]$ more b.txt
  66. xxxoooo
  67. [oracle@edsir4p1- ~]$ more a.txt
  68. xxxoooo
  69. [oracle@edsir4p1- ~]$ more c.txt
  70. xxxoooo
  71. [oracle@edsir4p1- ~]$ more b.txt_bk
  72. best
  73. [oracle@edsir4p1- ~]$ cp b.txt_bk a.txt
  74. [oracle@edsir4p1- ~]$ more a.txt
  75. best
  76. [oracle@edsir4p1- ~]$ more b.txt
  77. best
  78. [oracle@edsir4p1- ~]$ more c.txt
  79. best
  80. [oracle@edsir4p1- ~]$ ll *.txt
  81. -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 a.txt
  82. lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
  83. -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 c.txt
  84. -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
  85. -rw-r--r-- 1 oracle oinstall 8 Dec 4 12:57 e.txt
  86. [oracle@edsir4p1- ~]$ rm -rf b.txt
  87. [oracle@edsir4p1- ~]$ ll *.txt
  88. -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 a.txt
  89. -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 c.txt
  90. -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
  91. -rw-r--r-- 1 oracle oinstall 8 Dec 4 12:57 e.txt
  92. [oracle@edsir4p1- ~]$








概述

在本篇中,學習建立和管理硬連接和符號連接。學習:node

  • 建立硬或軟連接
  • 識別連接並知道它們的類型
  • 理解複製與連接文件之間的區別
  • 使用連接執行系統管理任務


連接簡介


在存儲設備上,文件或目錄包含在一些數據塊中。有關某個文件的信息包含在一個 inode 中,它記錄了全部者、最後訪問該文件的時間、文件的大小、它是不是目錄,以及誰能夠讀取或寫入它等信息。inode 編號也稱爲文件序列號 ,該編號在特定文件系統內是惟一的。一個 目錄條目 包含一個文件或目錄的名稱,以及用來存儲該文件或目錄的信息的 inode 的指針。python


建立連接


硬連接 是指向 inode 的目錄條目,而 軟連接 或 符號連接 是指向提供另外一個目錄條目的名稱的 inode 的目錄條目。存儲第二個名稱的準確機制可能依賴於文件系統和名稱的長度。符號連接也稱爲symlink 。linux

您能夠只爲文件建立硬連接,而不爲目錄建立硬連接。一個例外是一個包含該目錄和它的父目錄(. 和 ..)的目錄中的特殊目錄條目,它們是維護子目錄數量的硬連接。由於硬連接指向 inode,並且 inode 僅在特定的文件系統內是惟一的,因此硬連接不能跨文件系統使用。若是一個文件有多個硬連接,那麼只在指向該 inode 的最後一個連接被刪除,並且連接數量變爲 0 時,纔會刪除該文件。c++

軟連接或 symlink 僅按名稱指向另外一個文件或目錄,而不是按 inode。軟連接能夠跨越文件系統邊界進行使用。刪除軟連接不會刪除目標文件或目錄,刪除目標文件或目錄也不會自動刪除任何軟連接。shell

首先讓咱們看看如何建立硬和軟連接。在本教程後面,咱們將介紹識別和使用咱們在這裏建立的連接的方式。windows

硬連接

使用 ln 命令建立現有文件的額外的硬連接(但不能是目錄,即便系統將 . 和 .. as 設置爲硬連接)。centos

清單 1 展現瞭如何建立一個包含兩個文件和一個子目錄的目錄,其中包含 file1 的兩個硬連接,一個位於同一個目錄中,另外一個位於子目錄中。咱們向 file1 添加一個詞,而後向 file3 添加另外一個詞,並在子目錄中顯示該連接的內容,以代表全部連接確實都指向相同的數據。bash

清單 1. 建立硬連接


[plain]   view plain  copy

  1. [ian@atticf22 ~]$ mkdir -p lpi104-6/subdir  
  2.  [ian@atticf22 ~]$ touch lpi104-6/file1  
  3.  [ian@atticf22 ~]$ touch lpi104-6/file2  
  4.  [ian@atticf22 ~]$ ln lpi104-6/file1 lpi104-6/file3  
  5.  [ian@atticf22 ~]$ ln lpi104-6/file1 lpi104-6/subdir/file3sub  
  6.  [ian@atticf22 ~]$ echo "something" > lpi104-6/file1  
  7.  [ian@atticf22 ~]$ echo "else" >> lpi104-6/file3  
  8.  [ian@atticf22 ~]$ cat lpi104-6/subdir/file3sub  
  9.  something   
  10.  else  



若是嘗試建立跨文件系統或針對目錄的硬連接,則會得到錯誤。清單 2 顯示個人主目錄和 research 目錄在不一樣的文件系統上,並且跨這些文件系統建立硬連接的嘗試失敗了,與建立 lpi104-6 目錄的硬連接的嘗試同樣。

清單 2. 硬連接建立失敗


[plain]   view plain  copy

  1. [ian@atticf22 ~]$ df . research  
  2.  Filesystem     1K-blocks     Used Available Use% Mounted on   
  3.  /dev/sda5       71168700 31642752  35887712  47% /   
  4.  /dev/sdb3       60326992 30677592  26578276  54% /home/ian/research   
  5.  [ian@atticf22 ~]$ mkdir -p research/lpi104-6/  
  6.  [ian@atticf22 ~]$ ln lpi104-6/file1 research/lpi104-6/file3  
  7.  ln: failed to create hard link ‘ research/lpi104-6/file3 ’ =>   
  8. ‘ lpi104-6/file1 ’ : Invalid cross-device link   
  9.  [ian@atticf22 ~]$ ln lpi104-6 lpidir104-6  
  10.  ln: ‘ lpi104-6 ’ : hard link not allowed for directory  



軟連接


使用 ln 命令和 -s 選項來建立軟連接。軟連接使用文件或目錄名稱,這些名稱多是相對或絕對的。若是使用相對名稱,您可能但願當前工做目錄是您建立連接的目錄。不然,您建立的連接將是文件系統中的另外一個位置相對的連接。

清單 3 展現了爲咱們剛建立的 file1 建立軟連接的兩種方式,以及如何建立軟連接,而不是建立在 清單 2中失敗的兩個硬連接。

清單 3. 建立軟連接


[plain]   view plain  copy

  1. [ian@atticf22 ~]$ # Create symlink using absolute paths  
  2.  [ian@atticf22 ~]$ ln -s ~/lpi104-6/file1 ~/lpi104-6/file4  
  3.  [ian@atticf22 ~]$ # Create symlink using relative paths  
  4.  [ian@atticf22 ~]$ cd lpi104-6/  
  5.  [ian@atticf22 lpi104-6]$ ln -s file1 file5  
  6.  [ian@atticf22 lpi104-6]$ cd ..  
  7.  [ian@atticf22 ~]$ # Create symlink across file systems  
  8.  [ian@atticf22 ~]$ mkdir -p ~ian/research/lpi104-6  
  9.  [ian@atticf22 ~]$ ln -s ~/lpi104-6/file1 ~ian/research/lpi104-6/file4  
  10.  [ian@atticf22 ~]$ # Create symlink for directory  
  11.  [ian@atticf22 ~]$ ln -s lpi104-6 lpidir104-6  



與以前同樣,您可使用任何連接或目標文件名來引用該文件或目錄。清單 4 顯示了一些例子。

清單 4. 使用軟連接


[plain]   view plain  copy

  1. [ian@atticf22 ~]$ echo "another line" >> ~ian/research/lpi104-6/file  
  2.  [ian@atticf22 ~]$ # cat a symlink  
  3.  [ian@atticf22 ~]$ cat lpi104-6/file5  
  4.  something   
  5.  else   
  6.  [ian@atticf22 ~]$ # cat a hard link  
  7.  [ian@atticf22 ~]$ cat lpi104-6/file1  
  8.  something   
  9.  else   
  10.  [ian@atticf22 ~]$ # display directory contents using symlink  
  11.  [ian@atticf22 ~]$ ls lpidir104-6  
  12.  file1  file2  file3  file4  file5  subdir  



在建立連接時,讓咱們在工做目錄 不是咱們想要存放連接的目錄時使用相對路徑建立一個連接。下一節將介紹如何實現此目的。

清單 5. 建立不良的軟連接


[plain]   view plain  copy

  1. [ian@atticf22 ~]$ ln -s lpi104-6/file1 lpi104-6/file6  



識別連接


在上一節中,您瞭解瞭如何建立連接,但不知道如何區分您建立的連接。如今讓咱們討論一下這個主題。

查找信息

在許多系統上,ls 命令等同於 ls --color=auto ,它以不一樣顏色打印不一樣類型的文件系統對象。若是使用此選項,可能使用藍綠色文原本顯示 symlink,如 圖 1中所示。

圖 1. 使用 ls 的 --colors 選項來識別連接  使用 ls 的 --colors 選項來識別連接  

在舊配置上,可能使用深藍色背景來顯示硬連接。這些顏色可以使用 dircolors 程序來配置。若是要自定義您的終端外觀,您可能但願更改ls 的一些輸出的顏色。清單 6顯示了一種在 Fedora 22 系統上得到硬連接的藍色背景的方式,而 圖 2 則顯示告終果。使用手冊頁進一步理解該示例。

清單 6. 使用 dircolors 爲硬連接設置一種藍色背景

[plain]   view plain  copy

  1. [ian@atticf22 ~]$ # Save a copy of dircolors defaults  
  2.  [ian@atticf22 ~]$ dircolors -p > dircolors-defaults  
  3.  [ian@atticf22 ~]$ grep MULTI dircolors-defaults   
  4.  MULTIHARDLINK 00 # regular file with more than one link   
  5.  [ian@atticf22 ~]$ # Change MULTIHARDLINK to blue background   
  6.  [ian@atticf22 ~]$ sed -e'/MULTI/s/00/00;44/' dircolors-defaults > dircolors-new   
  7.  [ian@atticf22 ~]$ grep MULTI dircolors-new   
  8.  MULTIHARDLINK 00;44 # regular file with more than one link   
  9.  [ian@atticf22 ~]$ # Set the new colors for the current terminal session   
  10.  [ian@atticf22 ~]$ eval $(dircolors dircolors-new )  


圖 2. 使用藍色背景來標識硬連接  使用 ls 的 --colors 選項來識別連接  

對於可以區分顏色的視力正常的人而言,顏色可能很方便,但它們對其餘人沒多大用處,對 shell 腳本或程序確定也沒多大用處。沒有顏色,就須要更多的信息,好比使用ls -l 經過一個長清單所提供的信息。在 清單 7中,咱們爲第一個示例顯式禁用了顏色輸出,但您也能夠像咱們對另外兩個示例所作的同樣顯式調用/bin/ls 命令。

清單 7. 識別連接


[plain]   view plain  copy

  1. [ian@atticf22 ~]$ ls --color=none -lR lpi104-6  
  2.  lpi104-6:   
  3.  total 12   
  4.  -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1   
  5.  -rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2   
  6.  -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3   
  7.  lrwxrwxrwx. 1 ian ian   24 Aug  9 14:26 file4 -> /home/ian/lpi104-6/file1   
  8.  lrwxrwxrwx. 1 ian ian    5 Aug  9 14:26 file5 -> file1   
  9.  lrwxrwxrwx. 1 ian ian   14 Aug  9 14:34 file6 -> lpi104-6/file1   
  10.  drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir   
  11.   
  12.  lpi104-6/subdir:   
  13.  total 4   
  14.  -rw-rw-r--. 3 ian ian 15 Aug  9 14:19 file3sub   
  15.  [ian@atticf22 ~]$ /bin/ls -l ~ian/research/lpi104-6/file4  
  16.  lrwxrwxrwx. 1 ian ian 24 Aug  9 14:27 /home/ian/research/lpi104-6/file4 -> /home/ian/lpi104-6/file1   
  17.  [ian@atticf22 ~]$ /bin/ls -l lpidir104-6  
  18.  lrwxrwxrwx. 1 ian ian 8 Aug  9 14:27 lpidir104-6 -> lpi104-6  



輸出的第二列是一個連接計數,顯示了此文件的硬連接數,因此咱們知道 file一、file3 和 file3sub 都擁有多個指向它們表示的對象的硬連接。咱們仍沒有足夠的信息來知道它們都表示同一個對象。若是您刪除一個連接數大於 1 的文件,inode 中的連接數會減 1,但該文件只在連接數變爲 0 時纔會刪除。同一個文件的其餘全部硬連接將顯示一個如今減去了 1 的連接數。

在輸出的第一列中,您會看到第一個字符是表示符號連接的 「l」(L 的小寫形式)。您還會看到在 -> 字符後顯示了連接的目標。例如,file4 -> /home/ian/lpi104-6/file1。另外一個提示是,該大小是連接目標的名稱中的字符數。請注意,對於符號連接,目錄清單中的連接數沒有更新。刪除該連接不會影響目標文件。Symlink 不會阻止文件被刪除。若是目標文件被移動或刪除,那麼 symlink 將被破壞。出於這個緣由,許多系統在目錄清單中使用了顏色,一般使用淡藍色表示正常連接,使用紅色表示被破壞的連接。

您可使用 ls 命令的 -i 選項來顯示文件和目錄條目的 inode 數量。清單 8同時給出了咱們的 lpi104-6 目錄的短和長輸出。

清單 8. 顯示 inode 信息


[plain]   view plain  copy

  1. [ian@atticf22 ~]$ ls -i lpi104-6  
  2.  1988884 file1  1988884 file3  1988892 file5  1988605 subdir   
  3.  1988886 file2  1988885 file4  1988891 file6   
  4.  [ian@atticf22 ~]$ ls -il lpi104-6  
  5.  total 12   
  6.  1988884 -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1   
  7.  1988886 -rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2   
  8.  1988884 -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3   
  9.  1988885 lrwxrwxrwx. 1 ian ian   24 Aug  9 14:26 file4 -> /home/ian/lpi104-6/file1   
  10.  1988892 lrwxrwxrwx. 1 ian ian    5 Aug  9 14:26 file5 -> file1   
  11.  1988891 lrwxrwxrwx. 1 ian ian   14 Aug  9 14:34 file6 -> lpi104-6/file1   
  12.  1988605 drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir  



您還可使用 find 命令,使用 -type l 查找表達式來搜索符號連接,如 清單 9中所示。

清單 9. 使用 find 查找 symlink

[plain]   view plain  copy

  1. [ian@atticf22 ~]$ find lpi104-6 research/lpi104-6 -type l  
  2.  lpi104-6/file4   
  3.  lpi104-6/file6   
  4.  lpi104-6/file5   
  5.  research/lpi104-6/file4  


破壞的 symlink

在 清單 5 中,咱們聲明要建立一個不良的軟連接。這是破壞的 symlink 的一個示例。由於硬連接始終指向一個表示文件的 inode,因此它們始終有效。可是,symlink 可能出於許多緣由而遭到破壞,包括:

  • 在建立連接時,連接的原始文件或目標不存在(就像 清單 5 中同樣)。
  • 連接的目標被刪除或重命名。
  • 目標的路徑中的某個元素被刪除或重命名。

全部這些條件都不會拋出錯誤,因此您須要仔細考慮您在建立 symlink 時可能發生了什麼狀況。具體地講,對於絕對或相對路徑的選擇,可能受到您但願連接的對象在連接生存期中發生什麼的影響。

若是您使用顏色輸出,破壞的 symlink 可能在黑色背景上顯示爲紅色文本,就像 圖 1 中的 file6 的狀況同樣。不然,您須要使用 ls 的 -H 或 -L 選項來取消引用該連接,並提供有關目標的信息。-H 選項在命令行上取消引用連接,-L 選項取消引用顯示中包含的附加連接。清單 10演示了來自這兩個選項的輸出中的區別。

清單 10. 使用 ls -H 和 ls -L 取消引用連接


[plain]   view plain  copy

  1. [ian@atticf22 ~]$ /bin/ls -lH lpidir104-6  
  2.  total 12   
  3.  -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1   
  4.  -rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2   
  5.  -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3   
  6.  lrwxrwxrwx. 1 ian ian   24 Aug  9 14:26 file4 -> /home/ian/lpi104-6/file1   
  7.  lrwxrwxrwx. 1 ian ian    5 Aug  9 14:26 file5 -> file1   
  8.  lrwxrwxrwx. 1 ian ian   14 Aug  9 14:34 file6 -> lpi104-6/file1   
  9.  drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir   
  10.  [ian@atticf22 ~]$ /bin/ls -lL lpidir104-6  
  11.  /bin/ls: cannot access lpidir104-6/file6: No such file or directory   
  12.  total 20   
  13.  -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1   
  14.  -rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2   
  15.  -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3   
  16.  -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file4   
  17.  -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file5   
  18.  l?????????? ? ?   ?      ?            ? file6   
  19.  drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir  



請注意,錯誤消息代表 file6 不存在,另請注意針對它的包含全部 「?」 字符的輸出,它們一樣代表該文件不存在。

關於破壞的符號連接,還要說明最後一點。讀取該文件的嘗試將失敗,由於它不存在。可是,若是您擁有目標文件的合適權限,寫入它的嘗試將有效,如 清單 11中所示。請注意,咱們須要在寫入該文件以前建立 lpi104-6/lpi104-6。

清單 11. 讀取和寫入一個破壞的 symlink

[plain]   view plain  copy

  1. [ian@atticf22 ~]$ cat lpi104-6/file6  
  2.  cat: lpi104-6/file6: No such file or directory   
  3.  [ian@atticf22 ~]$ echo "Testing file6" > lpi104-6/file6  
  4.  bash: lpi104-6/file6: No such file or directory   
  5.  [ian@atticf22 ~]$ mkdir lpi104-6/lpi104-6  
  6.  [ian@atticf22 ~]$ cat lpi104-6/file6  
  7.  cat: lpi104-6/file6: No such file or directory   
  8.  [ian@atticf22 ~]$ echo "Testing file6" > lpi104-6/file6  
  9.  [ian@atticf22 ~]$ cat lpi104-6/file6  
  10.  Testing file6   
  11.  [ian@atticf22 ~]$ ls lpi104-6/lpi104-6  
  12.  file1   
  13.  [ian@atticf22 ~]$ ls -l lpi104-6/file6  
  14.  lrwxrwxrwx. 1 ian ian 14 Aug  9 14:34 lpi104-6/file6 -> lpi104-6/file1  


誰連接到我?

要肯定哪些文件是一個特定 inode 的硬連接,可使用 find 命令和 -samefile 選項及一個文件名,或者-inum 選項及一個 inode 編號,如 清單 12 中所示。

清單 12. 查找同一個文件的硬連接

[plain]   view plain  copy

  1. [ian@atticf22 ~]$ find lpi104-6 -samefile lpi104-6/file1  
  2.  lpi104-6/file1   
  3.  lpi104-6/file3   
  4.  lpi104-6/subdir/file3sub   
  5.  [ian@atticf22 ~]$ ls -i lpi104-6/file1  
  6.  1988884 lpi104-6/file1   
  7.  [ian@atticf22 ~]$ find lpi104-6 -inum 1988884  
  8.  lpi104-6/file1   
  9.  lpi104-6/file3   
  10.  lpi104-6/subdir/file3sub  


要查找哪些文件經過符號連接而連接到一個特定文件,可使用 find 命令和 -lname 選項及一個文件名,如 清單 13 所示。連接可使用相對或絕對路徑,因此您可能但願在名稱中放入一個前導的星號來找到全部匹配結果。

清單 13. 查找一個文件或目錄的符號連接

[plain]   view plain  copy

  1. [ian@atticf22 ~]$ find lpi104-6 research/lpi104-6 -lname "*file1"  
  2.  lpi104-6/file4   
  3.  lpi104-6/file6   
  4.  lpi104-6/file5   
  5.  research/lpi104-6/file4  


複製仍是連接

根據您想要完成的任務,有時會使用連接,有時複製一個文件可能會更好一些。主要區別在於,連接提供了一個文件的多個名稱,而副本會在兩個不一樣的名稱下建立兩組相同的數據。對於備份和測試用途,確定會使用副本,您但願試驗一個新程序而不讓您的操做數據處於風險之中。在須要某個文件(或目錄)的別名時(可能用於提供更方面或更短的路徑),可使用連接。在下一節中,咱們將介紹連接的其餘一些用法。

您已經看到,在更新一個文件時,它全部的連接都會看到更新信息,而複製文件不會這樣。您還看到,符號連接能夠破壞,後續寫入操做能夠建立新的文件。請當心使用連接。


連接和系統管理

連接(尤爲是符號連接)一般用在 Linux 系統管理中。命令一般具備別名,因此用戶不須要知道當前命令的版本號,但在必要的時候,可使用更長的名稱來訪問其餘版本。如 清單 14所示,python 命令是python2 的 symlink,python2 自己是 2.7 版的 python2.7 的 symlink。

清單 14. 將命令別名化爲一個特定版本

[plain]   view plain  copy

  1. [ian@atticf22 ~]$ which python  
  2.  /usr/bin/python   
  3.  [ian@atticf22 ~]$ ls -l /usr/bin/python  
  4.  lrwxrwxrwx. 1 root root 7 May 27 14:12 /usr/bin/python -> python2   
  5.  [ian@atticf22 ~]$ ls -l /usr/bin/python2  
  6.  lrwxrwxrwx. 1 root root 9 May 27 14:12 /usr/bin/python2 -> python2.7   
  7.  [ian@atticf22 ~]$ ls -l /usr/bin/python2.7  
  8.  -rwxr-xr-x. 1 root root 7120 May 27 14:12 /usr/bin/python2.7  


在多個命令名稱使用相同的基礎代碼時,好比存儲和從新啓動系統的各類命令,其餘用途就能夠派上用場。有時,一個新命令名稱(好比 genisoimage )將取代舊命令名稱,但舊名稱 (mkisofs) 保持爲新命令的連接。一些替代性 工具會普遍使用連接,因此您能夠在多個替代性工具中選擇一個來用於某條命令,好比java 。清單 15顯示了一些示例。

清單 15. 命令別名的示例

[plain]   view plain  copy

  1. [ian@atticf22 ~]$ which halt  
  2.  /usr/sbin/halt   
  3.  [ian@atticf22 ~]$ ls -l /usr/sbin/halt  
  4.  lrwxrwxrwx. 1 root root 16 Jun  9 09:16 /usr/sbin/halt -> ../bin/systemctl   
  5.  [ian@atticf22 ~]$ find /usr/sbin /usr/bin -lname "*/systemctl"  
  6.  /usr/sbin/halt   
  7.  /usr/sbin/telinit   
  8.  /usr/sbin/shutdown   
  9.  /usr/sbin/runlevel   
  10.  /usr/sbin/poweroff   
  11.  /usr/sbin/reboot   
  12.  [ian@atticf22 ~]$ which mkisofs  
  13.  /usr/bin/mkisofs   
  14.  [ian@atticf22 ~]$ ls -l /usr/bin/mkisofs  
  15.  lrwxrwxrwx. 1 root root 25 Jun 15 08:02 /usr/bin/mkisofs -> /etc/alternatives/mkisofs   
  16.  [ian@atticf22 ~]$ alternatives --display mkisofs  
  17.  mkisofs - status is auto.   
  18.  link currently points to /usr/bin/genisoimage   
  19.  /usr/bin/genisoimage - priority 50   
  20.  slave mkisofs-mkhybrid: /usr/bin/genisoimage   
  21.  slave mkisofs-mkhybridman: /usr/share/man/man1/genisoimage.1.gz   
  22.  slave mkisofs-mkisofsman: /usr/share/man/man1/genisoimage.1.gz   
  23.  Current `best' version is /usr/bin/genisoimage.  


庫名稱一般也使用 symlink 來管理,不管是容許程序在獲取當前版本時連接到通常名稱,仍是管理系統,好比可以運行 32 位程序的 64 位系統。清單 16顯示了一些示例。請注意,一些狀況會使用絕對路徑,而另外一些狀況會使用相對路徑。

清單 16. 庫連接

[plain]   view plain  copy

  1. [ian@atticf22 ~]$ ls -l /usr/lib*/libm.so*  
  2.  lrwxrwxrwx. 1 root root 21 Feb 23 10:31 /usr/lib64/libm.so -> ../../lib64/libm.so.6   
  3.  lrwxrwxrwx. 1 root root 12 Feb 23 10:33 /usr/lib64/libm.so.6 -> libm-2.21.so   
  4.  lrwxrwxrwx. 1 root root 12 Feb 23 10:35 /usr/lib/libm.so.6 -> libm-2.21.so   
  5.  [ian@atticf22 ~]$ find  /usr/lib/ /usr/lib64/ -lname "*libstdc++*"  
  6.  /usr/lib/gcc/x86_64-redhat-linux/5.1.1/libstdc++.so   
  7.  /usr/lib/gcc/x86_64-redhat-linux/5.1.1/32/libstdc++.so   
  8.  /usr/lib/gcc/x86_64-redhat-linux/5.1.1/32/libstdc++.a   
  9.  /usr/lib64/libstdc++.so.6   
  10.  [ian@atticf22 ~]$ ls -l /usr/lib64/libstdc++.so.6  
  11.  lrwxrwxrwx. 1 root root 19 Jun 18 06:52 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.21   
  12.  [ian@atticf22 ~]$ ls -l /usr/lib64/libwbclient*  
  13.  lrwxrwxrwx. 1 root root 19 Jul  1 10:37 /usr/lib64/libwbclient.so.0 -> libwbclient.so.0.12   
  14.  lrwxrwxrwx. 1 root root 40 Jul  1 10:37 /usr/lib64/libwbclient.so.0.12 ->   
  15.  /etc/alternatives/libwbclient.so.0.12-64  



原文地址:  

http://blog.csdn.net/sinat_31726559/article/details/51835785



1 . 使用方式 :ln [option] source_file dist_file 
                    -f 創建時,將同檔案名刪除. 
                    -i 刪除前進行詢問. 
                    ln -s abc cde 創建abc 的軟鏈接 
                    ln abc cde 創建abc的硬鏈接,

2. 軟連接與硬連接的區別(通俗): 
                    硬連接可認爲是一個文件擁有兩個文件名;而軟連接則是
                    系統新建一個連接文件,此文件指向其所要指的文件

3. 軟連接與硬連接的區別(講解):     

Linux 軟鏈接與硬鏈接

對於一個文件來講,有惟一的索引接點與之對應,而對於一個索引接點號,卻能夠有多個文件名與之對應。所以,在磁盤上的同一個文件能夠經過不一樣的路徑去訪問該文件。注意在Linux下是一切皆文件的啊,文件夾、新加的硬盤 ...均可以看着文件來處理的啊。
    鏈接有軟鏈接和硬鏈接(hard link)之分的,軟鏈接(symbolic link)又叫符號鏈接。符號鏈接至關於Windows下的快捷方式。
    不能夠對文件夾創建硬鏈接的,咱們一般用的仍是軟鏈接比較多。     
    
eg:
    ln -s source dist        # 創建軟鏈接
    ln source dist            # 創建硬鏈接


    軟連接實際上只是一段文字,裏面包含着它所指向的文件的名字,系統看到軟連接後自動跳到對應的文件位置處進行處理;相反,硬聯接爲文件開設一個新的目錄 項,硬連接與文件原有的名字是平權的,在Linux看來它們是等價的。因爲這個緣由,硬連接不能鏈接兩個不一樣文件系統上的文件。
(1)軟鏈接能夠 跨文件系統 ,硬鏈接不能夠 。實踐的方法就是用共享文件把windows下的 aa.txt文本文檔鏈接到linux下/root目錄 下 bb,cc . ln -s aa.txt /root/bb 鏈接成功 。ln aa.txt /root/bb 失敗 。

(2)關於 I節點的問題 。硬鏈接無論有多少個,都指向的是同一個I節點,會把 結點鏈接數增長,只要結點的鏈接數不是 0,文件就一直存在,無論你刪除的是源文件仍是 鏈接的文件 。只要有一個存在 ,文件就 存在 (其實也不分什麼源文件鏈接文件的 ,由於他們指向都是同一個 I節點)。 當你修改源文件或者鏈接文件任何一個的時候 ,其餘的文件都會作同步的修改。軟連接不直接使用i節點號做爲文件指針,而是使用文件路徑名做爲指針。因此 刪除鏈接文件 對源文件無影響,可是刪除源文件,鏈接文件就會找不到要指向的文件 。軟連接有本身的inode,並在磁盤上有一小片空間存放路徑名.  
(3)軟鏈接能夠對一個不存在的文件名進行鏈接 。  
(4)軟鏈接能夠對目錄進行鏈接。  

備 注:I節點 :它是UNIX內部用於描述文件特性的數據結構.咱們一般稱I節點爲文件索引結點(信息結點).i節點含有關於文件的大部分的重要信息,包括文件數據塊在 磁盤上的地址.每個I節點有它本身的標誌號,咱們稱爲文件順序號.I節點包含的信息 1.文件類型 2.文件屬主關係 3.文件的訪問權限 4.文件的時間截.  


   



最後 刪除符號連接,有建立就有刪除  

rm -rf   symbolic_name   注意不是rm -rf   symbolic_name/   




1.Linux連接概念
Linux連接分兩種,一種被稱爲硬連接(Hard Link),另外一種被稱爲符號連接(Symbolic Link)。默認狀況下,ln命令產生硬連接。

【硬鏈接】
硬鏈接指經過索引節點來進行鏈接。在Linux的文件系統中,保存在磁盤分區中的文件無論是什麼類型都給它分配一個編號,稱爲索引節點號(Inode Index)。在Linux中,多個文件名指向同一索引節點是存在的。通常這種鏈接就是硬鏈接。硬鏈接的做用是容許一個文件擁有多個有效路徑名,這樣用戶就能夠創建硬鏈接到重要文件,以防止「誤刪」的功能。其緣由如上所述,由於對應該目錄的索引節點有一個以上的鏈接。只刪除一個鏈接並不影響索引節點自己和其它的鏈接,只有當最後一個鏈接被刪除後,文件的數據塊及目錄的鏈接纔會被釋放。也就是說,文件真正刪除的條件是與之相關的全部硬鏈接文件均被刪除。

【軟鏈接】
另一種鏈接稱之爲符號鏈接(Symbolic Link),也叫軟鏈接。軟連接文件有相似於Windows的快捷方式。它其實是一個特殊的文件。在符號鏈接中,文件其實是一個文本文件,其中包含的有另外一文件的位置信息。

2.經過實驗加深理解
[oracle@Linux]$ touch f1          #建立一個測試文件f1
[oracle@Linux]$ ln f1 f2          #建立f1的一個硬鏈接文件f2
[oracle@Linux]$ ln -s f1 f3       #建立f1的一個符號鏈接文件f3
[oracle@Linux]$ ls -li            # -i參數顯示文件的inode節點信息
total 0
9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f1
9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f2
9797649 lrwxrwxrwx  1 oracle oinstall 2 Apr 21 08:11 f3 -> f1

從上面的結果中能夠看出,硬鏈接文件f2與原文件f1的inode節點相同,均爲9797648,然而符號鏈接文件的inode節點不一樣。

[oracle@Linux]$ echo "I am f1 file" >>f1
[oracle@Linux]$ cat f1
I am f1 file
[oracle@Linux]$ cat f2
I am f1 file
[oracle@Linux]$ cat f3
I am f1 file
[oracle@Linux]$ rm -f f1
[oracle@Linux]$ cat f2
I am f1 file
[oracle@Linux]$ cat f3
cat: f3: No such file or directory

經過上面的測試能夠看出:當刪除原始文件f1後,硬鏈接f2不受影響,可是符號鏈接f1文件無效

3.總結
依此您能夠作一些相關的測試,能夠獲得如下所有結論:
1).刪除符號鏈接f3,對f1,f2無影響;
2).刪除硬鏈接f2,對f1,f3也無影響;
3).刪除原文件f1,對硬鏈接f2沒有影響,致使符號鏈接f3失效;
4).同時刪除原文件f1,硬鏈接f2,整個文件會真正的被刪除。
 



【硬連接(Hard Link)】

硬連接指經過索引節點來進行鏈接,在Linux爲文件系統中,保存在磁盤分區中的文件無論是什麼類型都給它分配一個編號,稱爲索引節點號; 
硬連接指的就是在Linux中,多個文件名指向同一索引節點; 
常見用途:經過創建硬連接到重要文件,防止誤刪,刪除其實對應的是刪除其中的一個硬連接,當文件對應的硬連接都被刪除了,該文件才真正被刪除; 
注意: 默認狀況下,ln命令產生硬連接;

點擊(此處)摺疊或打開

  1. [root@centos7 home]# vi 1.txt
  2. hello, this is 1.
  3. [root@centos7 home]# cp -l 1.txt 2.txt # 爲1.txt創建硬連接2.txt,等同於ln 1.txt 2.txt
  4. [root@centos7 home]# more 2.txt # 查看2.txt文件中的內容和1.txt文件內容同樣
  5. hello, this is 1.

  6. # 這兩個文件的索引節點號,能夠看見索引號同樣:
  7. [root@centos7 home]# ls -li
  8. 總用量 69868
  9. 33845219 -rw-r--r--. 2 root root 44 1月 21 10:12 1.txt
  10. 33845219 -rw-r--r--. 2 root root 44 1月 21 10:12 2.txt
  11. [root@centos7 home]# vi 2.txt # 編輯2.txt,在末未添加:
  12. hello, this is 2.
  13. [root@centos7 home]# more 1.txt # 查看1.txt中是否內容改動
  14. hello, this is 1.
  15. hello, this is 2.
  16. [root@centos7 home]# rm -f 1.txt # 刪除1.txt
  17. [root@centos7 home]# more 2.txt # 查看2.txt的內容
  18. hello, this is 1.
  19. hello, this is 2.

  20. 建立硬連接命令:cp -l 1.txt 2.txt等同於ln 1.txt 2.txt # 爲1.txt創建硬連接2.txt

【軟連接】

也成爲符號連接(Symbolic Link),相似於Windows的快捷方式,其中包含的是另外一個文件的位置信息;


點擊(此處)摺疊或打開

  1. [root@centos7 home]# cp -s 2.txt sLink # 爲2.txt文件創建符號連接sLink,等同於ln –s 2.txt sLink
  2. [root@centos7 home]# ls –li # 能夠看到兩個文件有不一樣的索引節點號
  3. 總用量 69864
  4. 33845219 -rw-r--r--. 1 root root 44 1月 21 10:12 2.txt
  5. 36830246 lrwxrwxrwx. 1 root root 5 1月 21 10:21 sLink -> 2.txt
  6. [root@centos7 home]# more sLink
  7. hello, this is 1.
  8. hello, this is 2.

  9. [root@centos7 home]# rm -f sLink # 刪除符號連接,不影響源文件
  10. [root@centos7 home]# more 2.txt
  11. hello, this is 1.
  12. hello, this is 2.

  13. [root@centos7 home]# rm -f 2.txt # 刪除2.txt
  14. [root@centos7 home]# ls -li
  15. 總用量 69860
  16. 36830246 lrwxrwxrwx. 1 root root 5 1月 21 10:21 sLink -> 2.txt
  17. [root@centos7 home]# more sLink
  18. sLink: 沒有那個文件或目錄

建立符號連接命令:cp -s 2.txt sLink 等同於ln –s 2.txt sLink # 爲2.txt文件創建符號連接sLink

注意: 
只能在同種存儲媒體上的文件之間建立硬連接(Hard Link),不能在不一樣掛載點下的文件間建立硬連接,對於後一種狀況,可使用軟連接;(區分不一樣掛載點與同一掛載點不一樣目錄) 
如跨不一樣的掛載點創建硬連接的報錯信息:

[root  @centos7   home]  # ln 2.txt /dev/hLink  
 ln  : 沒法建立硬連接  "/dev/hLink"   =>    "2.txt"  : 無效的跨設備鏈接  

小結:

1: 硬連接是同一文件的不一樣訪問路徑,其對應的索引節點號是同樣的,刪除文件其實就是刪除其中的一個硬連接,若是該文件對應的硬連接都被刪除了該文件才被刪除,經常使用於保護文件;  2: 符號連接相似於Windows中對應的快捷方式,刪除符號連接不影響源文件,刪除源文件,則對應的符號連接也沒有意義;

相關文章
相關標籤/搜索