如何更新 Linux 的符號鏈接
UNIX 和 Linux 用戶發現鏈接有很多用途,特別是符號鏈接。我喜歡使用符號鏈接的一種方式是管理各種 IT 設備的配置備份。
我有一個目錄結構,用來存放我的文檔、更新及網絡上其他和計算機和設備有關的文件。設備可以包括路由器、接入點、NAS 服務器和筆記本電腦,通常有不同的品牌和版本。配置備份本身可能在目錄樹的深處,例如 /home/alan/Documents/network/device/NetgearRL5000/config。
為了簡化備份過程,我在主目錄中有一個名為 Configuration 的目錄。我使用這個目錄的符號鏈接來指向特定的設備目錄:
- :~/Configuration/ $ ls -F1
- Router@
- Accesspoint@
- NAS@
注意:ls 命令的 -F 選項在每個文件名上附加特殊字符以表示其類型。如上所示,@ 符號表示這些是鏈接。
創建一個鏈接
符號鏈接 Router 指向我的 Netgear RL5000 的 config 目錄。創建它的命令是 ln -s:
- $ ln -s /home/alan/Documents/network/device/NetgearRL5000/config Router
然后,用 ls -l 看一下并確認:
- :~/Configuration/ $ ls -l
- Router -> /home/alan/Documents/network/device/NetgearRL5000/config
- NAS -> /home/alan/Documents/network/device/NFSBox/config
- ...
這樣做的好處是,當對這個設備進行維護時,我只需進入 ~/Configuration/Router。
如果我決定用一個新的型號替換這個路由器,使用符號鏈接的第二個好處就很明顯了。我可能會把舊的路由器改成一個接入點。因此,它的目錄并沒有被刪除。相反,我有一個新的目錄,對應于新的路由器,也許是華碩 DF-3760。我創建這個目錄并確認它的存在:
- $ mkdir -p ~/Documents/network/device/ASUSDF-3760/config
- :~/Documents/network/device/ $ ls
- NetgearRL5000
- ASUSDF-3760
- NFSBox
- ...
另一個例子是,如果你的辦公室里有幾個接入點。你可以使用符號鏈接在邏輯上代表每一個,用一個通用的名字,如 ap1,ap2,等等,或者你可以使用描述性的詞語,如 ap_floor2,ap_floor3,等等。這樣,當物理設備隨時間變化時,你不必持續更新任何可能管理它們的進程,因為它們是在處理鏈接而不是實際的設備目錄。
更新一個鏈接
由于我的主路由器已經改變,我想讓路由器的符號鏈接指向它的目錄。我可以使用 rm 和 ln 命令來刪除和創建一個新的符號鏈接,但是有一種方法可以只用 ln 命令和幾個選項就可以一步完成:
- ~/Configuration/ $ ln -vfns ~/Documents/network/device/ASUSDF-3760/config/ Router
- 'Router' -> '/home/alan/Documents/network/device/ASUSDF-3760/config/'
- :~/Configuration/ $ ls -l
- Router -> /home/alan/Documents/network/device/ASUSDF-3760/config
- NAS -> /home/alan/Documents/network/device/NFSBox/config
根據手冊頁,這些選項如下:
- -v、--verbose:打印每個鏈接文件的名稱
- -f、--force:刪除目標文件(有必要,因為已經存在一個鏈接)
- -n、--no-dereference:如果鏈接名是一個目錄的符號鏈接,就把它當作一個正常的文件
- -s、--symbolic:制作符號鏈接而不是硬鏈接
總結
鏈接是 UNIX 和 Linux 文件系統中最強大的功能之一。其他操作系統也曾試圖模仿這種能力,但由于他們的文件系統缺乏基本的鏈接設計,這些系統從來沒有工作得那么好,也沒有那么可用。
上面的演示只是利用鏈接在生活生產環境中無縫瀏覽不斷變化的目錄結構的眾多可能性中的一種。鏈接提供了一個永遠不會長期靜態的組織所需的靈活性。
























