當我做一個簡單的操作時,看到 find 迭代/遍歷整個檔案系統,讓我感到驚訝
find -inum 12345
如果沒有背景信息,在我看來應該有更簡單的方法來告訴所有具有這個特定 inode 12345 (這只是一個佔位符)的文件?
有沒有更好的方法呢?不需要檢查檔案系統的所有目錄結構,只需判斷哪些檔案名稱與索引節點相關?
更新
還有一個問題可以解決這個問題 快速尋找哪些檔案屬於特定 inode 編號 但目的是找到更好(更快的方法)。
這個問題更直接的是知道為什麼會出現這樣的問題?也許有一個與權限等相關的充分理由,這會試圖故意讓使用者難以避免遍歷目錄結構來尋找索引節點的所有檔案名稱。
儘管如此,任何檔案系統都會遇到這樣的問題,將所有檔案名稱告訴 inode (至少是特權使用者root
) ,這似乎很奇怪
我最想回答這個問題(如果重要的話)的檔案系統是 ext4。
答案1
非常簡單的原因是,至少對於 ext2/ext3/ext4 類型的檔案系統,檔案名稱是透過目錄條目資料儲存在目錄類型檔案中。
這意味著來自類型目錄的那些檔案具有或多或少複雜的系統來儲存檔案名稱(目錄中的檔案)以及導致這些檔案的資料的索引節點。
稍微簡化了(ext3/4 使用哈希表增強功能來加速目錄樹遍歷等...)它看起來像這樣的列表:
## filenames ## ## inode-numbers ##
filename1 0123
filename2 01242
anotherfilename 3313
yetanotherfilename 11233
本質上是檔名僅發生在與目錄文件相關的資料內部,並且不儲存在元資料中的任何位置檔案系統儲存對於/的索引節點。因此,取得與索引節點號相關的檔案名稱的唯一方法是遍歷所有目錄檔案的所有目錄條目。
答案2
你寫了:
當我執行一個簡單的 find -inum 12345 時,令我驚訝的是發現 find 迭代/遍歷整個檔案系統
find
根據定義,樹是否從給定的一個或多個目錄開始遍歷,預設起始目錄為.
.
find -inum 12345
將從目前工作目錄開始遍歷整個目錄樹。它可能不會遍歷整個檔案系統,除非.
碰巧包含檔案系統安裝點。
有更有效的方法來查找具有給定索引節點號的所有檔案 - fsdb
、debugfs
和ncheck
在您連結到的答案中 - 但find
必須進行樹遍歷,因為標準。請注意,如果您要查找的索引節點只有一個鏈接,您可以提供find
選項-quit
(如果支援)在第一個匹配後結束樹遍歷。
即使其他命令也不總是很快,部分原因是它們必須查看整個檔案系統而不僅僅是目錄樹,但它們會盡力利用可用的資料。基本問題是大多數 Unix 檔案系統的結構。
- 文件的索引節點中有很多信息,但“文件的名稱或名稱”和“包含該文件的目錄或目錄”並不在其中。
- 大多數 Unix 檔案系統上的目錄結構非常簡單:它只包含一個條目列表,每個條目都是一個(索引節點號,檔案名稱)對。
- 要尋找包含inode 12345 的一個或多個目錄,以及這些目錄引用該目錄的名稱,在大多數Unix 檔案系統上,這些命令必須搜尋檔案系統上每個目錄的每個條目,直到找到所有符合的條目。文件的索引節點做包含引用它的目錄條目的數量,因此一旦發現這麼多條目,他們就可以停止搜尋。
- 相較之下,尋找目錄名稱的效率要高得多,因為每個目錄都包含其父目錄的索引節點號,
..
因此只需在一個目錄中搜尋符合的條目即可。 (有一個例外:檔案系統的根目錄有一個..
條目指向同一目錄。)
答案3
更簡單的答案可能是類比。
想像在電話簿中搜尋電話號碼而不是姓名。