Linux ln 建立連結檔 詳細教學及用例說明

本篇將介紹如何使用 Linux 的 ln 命令,包括如何建立硬連結、軟連結,以及如何處理建立時會遇到的強制覆蓋舊檔、自動備份檔案和路徑差異等問題。

了解軟硬連結之間的差異

比較項目軟連結(Soft Link)硬連結(Hard Link)
inode軟連接原文件&鏈接文件擁有不同的inode號,代表是兩個不同的文件硬連接原文件和鏈接文件共用一個inode號,代表他們是同一
個文件
文件屬性軟連接明確寫出了是連接文件硬連結不會表示,因為在本質上是相同文件和原文件是完全一致。
檔案大小只有一個連結的大小硬連結文件顯示的大小是跟原文件是一樣的。
跨文件系統建立支援不支援
檔案夾支援不支援

如何建立硬連結?

硬連結是一種使用相同 inode 的檔案系統物件。ln 命令在不帶參數的情形下,預設會以硬連結建立:

# 建立硬連結
ln cj_ln_test.txt cj_ln_test_HL.txt

這個命令會建立一個名為 cj_ln_test_HL.txt 的硬連結檔,它指向 cj_ln_test.txt 這個檔案。

為了查看硬連結的效果,我們可以使用 ls -is 命令來查看 inode 資訊:

# 查看 inode
ls -is

# 輸出內容
5253992 0 cj_ln_test_HL.txt
5253992 0 cj_ln_test.txt

我們可以看到,硬連結檔和原始檔案都有相同的 inode 號碼 “5253992”。

硬連結使用情境

  • 檔案備份:
    為了防止重要的檔案被誤刪,檔案備份是一種好的辦法,但複製檔案會帶來磁碟空間的消耗。硬連結能在不佔用額外磁碟空間的情況下實現檔案備份。
  • 檔案共用:
    多人共同維護同一份檔案時,可以通過硬連結的方式,在私人目錄裡建立硬連結,每個人對硬連結檔的修改都會反映到原始檔,但又避免因某個人誤刪而造成整個檔案消失的問題。
  • 檔案分類:
    不同的檔案資源需要分類,比如某個電影即使的分類是「動作」和「漫威」,我們可以分別在這兩個資料夾裡建立硬連結,這樣可以避免重複複製電影浪費磁碟空間。
    雖然使用軟連結也可以達成,但是軟連結有一個缺點。就是如果原始檔改變了位置或名稱,軟連結就會失去作用。

如何建立軟連結檔?

軟連結(符號連結)是一種以路徑來指向目標檔案的連結檔,可以使用絕對路徑或相對路徑。

要使用 ln 指令建立軟連結,必須加上 -s 參數:

# 建立軟連結
ln -s cj_ln_test.txt cj_ln_test_SL.txt

這樣就會建立一個 cj_ln_test_SL.txt 軟連結檔,指向 cj_ln_test.txt 這個檔案。

為了查看軟連結的效果,我們可以使用 ls -isl 命令來查看 inode 資訊:

# 查看 inode
ls -isl

# 輸出內容
5254014 0 lrwxrwxrwx 1 admin admin 14 May 29 18:46 cj_ln_test_SL.txt -> cj_ln_test.txt
5253992 0 -rw-rw-r-- 1 admin admin  0 May 29 18:18 cj_ln_test.txt

軟連結的 inode 與原始檔案不同,例如 cj_ln_test_SL.txt 的 inode 為 5254014,而 cj_ln_test.txt 的 inode 為 5253992。從這裡可以看出 cj_ln_test_SL.txt 是指向 cj_ln_test.txt 的軟連結檔。

軟連結使用情境

  • 捷徑:
    對於路徑很深的檔案,查詢起來不太方便。利用軟連結在桌面建立捷徑,可以迅速開啟並編輯檔案。
  • 靈活切換不同版本的程式:
    對於機器上同時存在多個版本的程式,可以通過更改軟連結的指向,從而迅速切換程式版本。例如,可以用這種方式來切換python版本。

強制覆蓋舊檔

在預設的狀況下,如果目標位置已經有同名的連結檔案的話,ln 指令就會拋出錯誤訊息:

# 建立軟連結
ln -s cj_ln_test.txt cj_ln_test_SL.txt

# 輸出內容
ln: failed to create symbolic link 'cj_ln_test_SL.txt': File exists

若要強制覆蓋舊有的連結檔案並重新指向新路徑,可以在 ln 指令中加上 -f 參數:

# 強制覆蓋舊檔
ln -f -s cj_ln_test.txt cj_ln_test_SL.txt

自動備份舊軟連結

如果目標位置已經有同名的連結檔案的話,我們可以在 ln 指令中加上 -b 參數,讓它自動將舊有的連結檔案備份起來,然後再建立新的連結檔:

# 自動備份舊檔
ln -b -s cj_ln_test.txt cj_ln_test_SL.txt

ln 會在原本的軟連結檔案 cj_ln_test_SL.txt 的檔名後面加上一個 ~ ,作為備份檔的檔名

# 查看檔案資訊
ls -l

# 輸出內容
lrwxrwxrwx 1 admin admin  14 May 29 19:05 cj_ln_test_SL.txt -> cj_ln_test.txt
lrwxrwxrwx 1 admin admin 14 May 29 19:00 cj_ln_test_SL.txt~ -> cj_ln_test.txt
-rw-rw-r-- 1 admin admin 0 May 29 18:18 cj_ln_test.txt

若要指定備份檔的結尾名稱,可以在 ln 指令中加上 -S 參數,並使用大寫的 S:

# 指定備份檔結尾名稱
ln -b -S ".bp" -s cj_ln_test.txt cj_ln_test_SL.txt

這樣 ln 就會在原本的軟連結檔案名稱後面加上 .bp 作為備份檔的檔名。

# 查看檔案資訊
ls -l

# 輸出內容
lrwxrwxrwx 1 admin admin 14 May 29 19:08 cj_ln_test_SL.txt -> cj_ln_test.txt
lrwxrwxrwx 1 admin admin 14 May 29 19:00 cj_ln_test_SL.txt~ -> cj_ln_test.txt
lrwxrwxrwx 1 admin admin 14 May 29 19:05 cj_ln_test_SL.txt.bp -> cj_ln_test.txt
-rw-rw-r-- 1 admin admin 0 May 29 18:18 cj_ln_test.txt

軟連結時應該使用絕對路徑或相對路徑?

建立連結檔案時,可以使用相對路徑或者絕對路徑來指定目標位置,例如:

# 使用相對路徑
ln -s ../lntest/cj_ln_test.txt cj_ln_test_SL.txt

# 使用絕對路徑
ln -s /home/admin/lntest/cj_ln_test.txt cj_ln_test_SL.txt

因為軟連結是根據路徑來找到目標檔案的,所以使用相對路徑和絕對路徑會影響到軟連結的有效性。如果移動了軟連結或目標檔案,那麼用相對路徑建立的軟連結可能就無法正確地找到目標了。但是用絕對路徑建立的軟連結就不會有這個問題,因為它指向的位置是固定的。

至於硬連結檔是直接使用相同的 inode,所以不管是用相對路徑或絕對路徑,效果都相同。

參考來源:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端