軟鏈接(Symbolic link)和硬鏈接(Hard link)是Unix-like操作系統中用于創建文件鏈接的兩種方式。
區別如下:
1. 硬鏈接可以將多個文件鏈接到同一個inode(文件索引節點),多個文件實際上指向同一個物理文件,因此對其中一個文件的操作會影響其他鏈接文件。而軟鏈接是一個指向目標文件的文件,它實際上是一個特殊的文件,里面存儲著目標文件的路徑名,因此對軟鏈接文件的操作并不會影響到目標文件。
2. 硬鏈接只能鏈接到同一個文件系統中的文件,而軟鏈接可以鏈接到不同的文件系統中的文件。
3. 硬鏈接沒有文件大小的概念,因為多個鏈接文件實際上指向的是同一個物理文件。而軟鏈接本身有文件大小,但是非常小,只是保存了目標文件的路徑名。
4. 刪除目標文件時,如果有硬鏈接指向它,它并不會真正刪除,只有當所有硬鏈接都被刪除后,物理文件才會被釋放。而軟鏈接則不會受到影響,只是指向的目標文件不存在時,軟鏈接會變為無效鏈接。
總結來說,硬鏈接更像是對物理文件的多個名稱引用,而軟鏈接更像是對目標文件的一個符號性的鏈接。
以下是一個示例的Shell腳本,用來表示軟鏈接和硬鏈接的不同:
#!/bin/bash
# 創建目標文件
echo "This is the target file" > target.txt
# 創建硬鏈接
ln target.txt hardlink.txt
# 創建軟鏈接
ln -s target.txt softlink.txt
# 打印目標文件的內容
echo "Content of target file:"
cat target.txt
# 打印硬鏈接的內容
echo "Content of hardlink:"
cat hardlink.txt
# 打印軟鏈接的內容
echo "Content of softlink:"
cat softlink.txt
# 修改目標文件的內容
echo "Modified content of target file" > target.txt
# 打印目標文件的內容
echo "Content of target file (after modification):"
cat target.txt
# 打印硬鏈接的內容
echo "Content of hardlink (after modification):"
cat hardlink.txt
# 刪除目標文件
rm target.txt
# 打印目標文件的內容
echo "Content of target file (after deletion):"
cat target.txt
# 打印硬鏈接的內容
echo "Content of hardlink (after deletion):"
cat hardlink.txt
# 打印軟鏈接的內容
echo "Content of softlink (after deletion):"
cat softlink.txt
運行上述腳本后,可以觀察到以下結果:
- 目標文件(target.txt)和硬鏈接(hardlink.txt)的內容完全一樣。
- 軟鏈接(softlink.txt)的內容為目標文件的路徑名。
- 修改目標文件的內容后,目標文件和硬鏈接的內容都發生了變化,而軟鏈接的內容沒有變化。
- 刪除目標文件后,硬鏈接仍然可以正常訪問目標文件的內容,而軟鏈接變為無效鏈接。
以下是另一個示例的Shell腳本,用來表示軟鏈接和硬鏈接的不同:
#!/bin/bash
# 創建目標文件
echo "This is the target file" > target.txt
# 創建硬鏈接
ln target.txt hardlink.txt
# 創建軟鏈接
ln -s target.txt softlink.txt
# 打印目標文件的inode號碼和文件大小
echo "Target file:"
ls -li target.txt
ls -l target.txt
# 打印硬鏈接的inode號碼和文件大小
echo "Hard link:"
ls -li hardlink.txt
ls -l hardlink.txt
# 打印軟鏈接的inode號碼和文件大小
echo "Soft link:"
ls -li softlink.txt
ls -l softlink.txt
# 刪除目標文件
rm target.txt
# 打印目標文件的inode號碼和文件大小(已刪除,無法查看)
echo "Target file after deletion:"
ls -li target.txt
ls -l target.txt
# 打印硬鏈接的inode號碼和文件大小(鏈接的物理文件還存在)
echo "Hard link after deletion of target file:"
ls -li hardlink.txt
ls -l hardlink.txt
# 打印軟鏈接的inode號碼和文件大小(鏈接的目標文件不存在)
echo "Soft link after deletion of target file:"
ls -li softlink.txt
ls -l softlink.txt
運行上述腳本后,可以觀察到以下結果:
- 目標文件(target.txt)和硬鏈接(hardlink.txt)在inode號碼和文件大小上完全一樣。
- 軟鏈接(softlink.txt)的inode號碼與目標文件不同,而文件大小非常小(通常是目標文件路徑名的長度)。
- 刪除目標文件后,目標文件無法再訪問,但是硬鏈接仍然可以訪問相同的內容。
- 刪除目標文件后,軟鏈接變為無效鏈接(inode號碼不再和目標文件對應),不能再訪問目標文件。