本篇將介紹如何使用 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,所以不管是用相對路徑或絕對路徑,效果都相同。