web-dev-qa-db-ja.com

特定のiノード番号に属するファイルをすばやく見つける

私はこのコマンドを知っています:

find /path/to/mountpoint -inum <inode number>

しかし、これは非常に遅い検索です。これを行うには、より高速な方法が必要だと感じています。誰かがより速い方法を知っていますか?

49
Alex

Ext4ファイルシステムの場合、次の例のようにdebugfsを使用できます。

$ Sudo debugfs -R 'ncheck 393094' /dev/sda2 2>/dev/null
Inode   Pathname
393094  /home/enzotib/examples.desktop

答えは即座ではありませんが、findよりも優れているようです。
取得した出力を簡単に解析して、ファイル名を取得できます。

35
enzotib

btrfs

man btrfs-inspect-internal さんのコメント:

   inode-resolve [-v] <ino> <path>
       (needs root privileges)

       resolve paths to all files with given inode number ino in a given
       subvolume at path, ie. all hardlinks

       Options

       -v
           verbose mode, print count of returned paths and ioctl()
           return value

例:

  • Sudo btrfs inspect-internal inode-resolve 15380 /home
7
Tom Hale

マシンのどこかに、すべてのINODEのリストがあります。

この問題は電話帳に似ています。これは名前のリストであり、電話番号は複数の人が使用する場合があります。番号で検索する場合、その番号を誰が共有しているかを確認するには、誰かが逆引き電話帳を作成しない限り、長い時間がかかります。

逆引きの電話帳のように編成された逆引きのデータベースを作成する方がよい。

この問題は2つのスクリプトで解決できます(私はそれほどプログラマではありません...私が書いたコードをおそらく笑うでしょう)。

スクリプト1:逆引き参照テーブルを作成します。すべてのファイルで「検索」を実行し、INODE、FILENAMEの2列のテーブルを作成します。同じINODE番号を共有するFILENAMESを並べ替えて配列にします。

(バイナリツリーを作成して、新しいリストにすばやくアクセスできます)。

SCRIPT2:新しいリバースリストを検索し、FILENAMESの配列を引き出します。

唯一の欠点は、これをリアルタイムで実行できないことです。 INODESは常に変化するため、最新の情報が必要な場合は、テーブルを再生成する必要があります。

0
Craig

ほとんどのUnicesにあり、Linuxのどこかで利用できるfsdbコマンドを確認できます。これは、ファイルのコア内のiノード構造にアクセスできる強力なコマンドなので、注意してください。構文も非常に簡潔です。

AIXの場合はfsdb

Solarisではfsdb再リンクファイル

Fsdbは実際にはiノードのファイル名を検出させませんが、doesとすると、本質的に、指定したときにiノードに直接アクセスできます。ファイル自体(または少なくともデータブロックポインター)に移植するので、その点では検索よりも高速です;-)。
質問には、ファイルの処理方法が指定されていません。 NFSファイルハンドルのデコードを頻繁に行っていますか?

sc。

0
swisscheese