1.ln 命令:
- 創建符號鏈接:
ls -s fileName softLinkName
- 示例:
ln -s test.txt test.ln
- 查看鏈接:
ls -l test.ln
可以看到test.ln
是指向test.txt
這個文件的
- 示例:
- 創建硬鏈接:
ls test.txt test
- 示例:
ln test.txt test1.ln
- 查看鏈接:
ls -l test1.ln
- 示例:
2. 符號鏈接和硬鏈接區別:
符號鏈接類似於 Windows 系統的快捷方式, 符號鏈接要佔用一個 inode 號, 符號鏈接可以連接到普通文件和文件夾; 硬鏈接不佔用 inode 號, 硬鏈接只能鏈接到普通文件.
Linux 讀取文件首先是通過文件名找到對應的 inode 號, 然後根據 inode 號找到實際存放數據的 block 的位置, 然後讀取數據.
Linux 的文件是屬於某個文件夾的, 當然文件夾也是一個文件. Linux 系統創建文件夾是會分配一個 inode 和至少一個 block, 文件夾的 block 存放的數據就包括了在該文件夾下面的文件名稱.
當創建一個硬鏈接時, 只是在該鏈接的所屬的文件夾的 block 中增加了一個新的記錄, 也就是這個硬鏈接的名稱, 這個硬鏈接必然有一個指向的 inode 號, 這個 inode 號就是創建該鏈接時文件的 inode 號. 當刪除創建鏈接的文件時, 通過該鏈接仍然能夠訪問文件. 硬鏈接相當於給同一個文件取了兩個或多個名稱, 通過任意一個名稱都能訪問到該文件的內容.
當創建一個符號鏈接時, 是創建了一個新的文件, Linux 系統也會給它分配一個 inode 和 block. 但是該文件和普通文件的區別在於: 普通文件的 block 中存放的是該文件的數據, 但是該文件的 block 存放的是一個文件名, 這個文件名就是它所鏈接到的文件. Linux 訪問該鏈接時找到該鏈接所鏈接的實際文件, 然後再通過實際文件的名稱去訪問實際文件的數據. 當實際文件被刪除之後, 通過鏈接也就訪問不到文件數據了.
從編程語言的角度去理解的話, 硬鏈接就是指針, 而符號鏈接就是指針的指針. 原始的文件內容就是數組 a 指向的內容. 現在 b 也指向 a 指向的內容, b 就可稱之爲硬鏈接; 而 c 指向的是 b 而不是 b 的內容, 因此 c 可以稱之爲 符號鏈接.
int a[4] = {0};
int *b = a;
int **c = &a;