Bash

硬連結算作普通文件嗎?

  • October 8, 2015

我想知道是否有辦法註冊這個,但由於大多數現代搜尋引擎不能很好地處理超過 5 個單詞的片語,我需要一些幫助。

我想知道這一點,因為我正在製作一個 bash 腳本,它必須將文件註冊為某些類型並做出相應的決定。這在技術上對我的項目並不重要,但我很好奇。

另外,如果它們被認為是正常文件,那麼有沒有辦法檢查這些文件是否是硬連結而無需解析ls -i?有沒有辦法在不使用命令的情況下檢查某個任意文件 X 是否硬連結到其他任意文件 Y find -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一個目錄返回的連結數是子目錄的數量,包括...正確的。或者,至少,雖然它會為您提供正確的數字,但出於錯誤的原因,它是正確的!

如果我們創建一個目錄並執行 als -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/..

因此,每個新的子目錄都會將連結計數增加一,因為..它包含的條目。

引用自:https://unix.stackexchange.com/questions/234402