硬連結算作普通文件嗎?
我想知道是否有辦法註冊這個,但由於大多數現代搜尋引擎不能很好地處理超過 5 個單詞的片語,我需要一些幫助。
我想知道這一點,因為我正在製作一個 bash 腳本,它必須將文件註冊為某些類型並做出相應的決定。這在技術上對我的項目並不重要,但我很好奇。
另外,如果它們被認為是正常文件,那麼有沒有辦法檢查這些文件是否是硬連結而無需解析
ls -i
?有沒有辦法在不使用命令的情況下檢查某個任意文件 X 是否硬連結到其他任意文件 Yfind -i
?
在 Unix 風格的系統中,表示文件系統對象的資料結構(換句話說,關於文件的數據)儲存在所謂的“inode”中。
文件名只是指向此 inode 的連結,稱為“硬連結”。給定文件的第一個名稱和任何後續連結之間沒有區別。所以答案是“是的”:硬連結是一個正常文件,實際上,一個正常文件是一個硬連結。
該
ls
命令將顯示文件有多少硬連結。例如:
seumasmac@comp:~$ echo Hello > /tmp/hello.txt seumasmac@comp:~$ ls -l /tmp/hello.txt -rw-rw-r-- 1 seumasmac seumasmac 6 Oct 4 13:05 /tmp/hello.txt
在這裡,我們創建了一個名為
/tmp/hello.txt
.1
輸出中的表示ls -l
此文件有 1 個硬連結。這個硬連結就是文件名本身/tmp/hello.txt
。如果我們現在創建另一個指向該文件的硬連結:
seumasmac@comp:~$ ln /tmp/hello.txt /tmp/helloagain.txt seumasmac@comp:~$ ls -l /tmp/hello* -rw-rw-r-- 2 seumasmac seumasmac 6 Oct 4 13:05 /tmp/helloagain.txt -rw-rw-r-- 2 seumasmac seumasmac 6 Oct 4 13:05 /tmp/hello.txt
您現在可以看到兩個文件名都表明該文件有 2 個硬連結。這些都不是“正確的”文件名,它們都同樣有效。我們可以看到它們都指向同一個 inode(在本例中為 5374043):
seumasmac@comp:~$ ls -i /tmp/hello* 5374043 /tmp/helloagain.txt 5374043 /tmp/hello.txt
有一個常見的誤解,即這對於目錄是不同的。我聽說有人說
ls
一個目錄返回的連結數是子目錄的數量,包括.
和..
不正確的。或者,至少,雖然它會為您提供正確的數字,但出於錯誤的原因,它是正確的!如果我們創建一個目錄並執行 a
ls -ld
我們得到:seumasmac@comp:~$ mkdir /tmp/testdir seumasmac@comp:~$ ls -ld /tmp/testdir drwxrwxr-x 2 seumasmac seumasmac 4096 Oct 4 13:20 /tmp/testdir
這表明該目錄有 2 個硬連結。這些都是:
/tmp/testdir /tmp/testdir/.
請注意,這不是
/tmp/testdir/..
指向此目錄的連結,而是指向. 這告訴你為什麼“子目錄的數量”這個東西有效。當我們創建一個新的子目錄時:/tmp
seumasmac@comp:~$ mkdir /tmp/testdir/dir2 seumasmac@comp:~$ ls -ld /tmp/testdir drwxrwxr-x 3 seumasmac seumasmac 4096 Oct 4 13:24 /tmp/testdir
您現在可以看到有 3 個指向
/tmp/testdir
目錄的硬連結。這些都是:/tmp/testdir /tmp/testdir/. /tmp/testdir/dir2/..
因此,每個新的子目錄都會將連結計數增加一,因為
..
它包含的條目。