Linux中如何列舉某個inode的所有硬連結路徑而不遍歷整個檔案系統?

Linux中如何列舉某個inode的所有硬連結路徑而不遍歷整個檔案系統?

我想知道所有具有相同索引節點號的路徑,我發現ls - 列出所有具有相同索引節點號的檔案? - Unix 和 Linux 堆疊交換然而,答案涉及使用該find實用程式遍歷整個包含 inode 的檔案系統,這對於具有大量檔案的檔案系統來說是不實用的。

由於硬連結資訊應儲存在檔案系統的特定資料結構中,是否可以使用特定於檔案系統的實用程式直接檢索此類資訊?

答案1

只有當索引節點本身包含每個連結物件的位置時,這才可能實現。這是不切實際的,因為在目錄結構中移動其中一個檔案的情況下,它需要對 inode 本身進行多次更新(和驗證步驟)。在 inode 中擁有實際的檔案路徑意味著 inode 中會有更多的開銷,因為它必須動態更改其大小以補償路徑變更或重新命名,並且 inode 大小可能會有很大變化。

相反,索引節點只包含連結的數量,而不包含去往何處或來自哪裡。這個連結數量可以是單一 32 位元字段,並且不會導致 inode 大小發生變化,它可以「就地」更新,而不是需要載入、修改整個項目,然後再次保存在不同的位置。

列出索引節點號碼的唯一位置是目錄物件本身。請記住,目錄本質上只是將其他文件連結在一起的特殊文件。這樣,對於檔案移動,連結數量保持不變,並且只是幾個目錄更新。對於刪除或添加,它是目錄更改和索引節點的小更新。

因此,正如您所發現的,唯一的方法是遍歷整個檔案系統來搜尋該 inode 的出現。

相關內容