Linux でファイルシステム全体を走査せずに、特定の inode のすべてのハードリンク パスを列挙するにはどうすればよいですか?

Linux でファイルシステム全体を走査せずに、特定の inode のすべてのハードリンク パスを列挙するにはどうすればよいですか?

同じinode番号を持つすべてのパスを知りたいのですが、ls - 同じ inode 番号を持つすべてのファイルを一覧表示しますか? - Unix & Linux Stack Exchangeただし、この答えには、ユーティリティを使用して inode を含むファイルシステム全体を走査することが含まれますfindが、これはファイル数が多いファイルシステムでは実用的ではありません。

ハードリンク情報はファイルシステムの特定のデータ構造に保存される必要があるため、ファイルシステム固有のユーティリティを使用してそのような情報を直接取得することは可能ですか?

答え1

これは、inode 自体にリンクされたすべてのオブジェクトの場所が含まれている場合にのみ可能です。ディレクトリ構造内でファイルの 1 つが移動された場合、inode 自体にさらにいくつかの更新 (および検証手順) が必要になるため、実用的ではありません。inode に実際のファイル パスがあると、パスの変更や名前の変更を補正するためにサイズを動的に変更する必要があり、inode サイズが大きく変化する可能性があるため、inode のオーバーヘッドが大幅に増加します。

代わりに、inode にはリンクの数のみが含まれ、リンク先やリンク元は含まれません。このリンクの数は単一の 32 ビット フィールドで、inode サイズは変更されません。アイテム全体をロードして変更し、別の場所に再度保存する必要はなく、「その場で」更新できます。

inode 番号がリストされる唯一の場所は、ディレクトリ オブジェクト自体です。ディレクトリは、本質的には他のファイルをリンクする特別なファイルであることに注意してください。そのため、ファイルを移動する場合、リンクの数は変わりません。ディレクトリの更新は数回だけです。削除または追加の場合は、ディレクトリの変更と inode のマイナー更新になります。

結果として、唯一の方法は、あなたが発見したように、ファイルシステム全体を走査してその inode の出現を検索することです。

関連情報