特定のinode番号に属するファイルを素早く見つける

特定のinode番号に属するファイルを素早く見つける

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

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

しかし、これは非常に遅い検索なので、もっと速い方法があるはずです。もっと速い方法をご存知の方はいませんか?

答え1

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

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

答えはすぐには得られませんが、 よりも早いようですfind

の出力はdebugfs簡単に解析してファイル名を取得できます。

$ sudo debugfs -R 'ncheck 393094' /dev/sda2 | cut -f2 | tail -n2 > filenames

答え2

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

答え3

基本的な問題は、ほとんどのファイルシステムにこの方向で動作するインデックスがないことです。この種のことを頻繁に行う必要がある場合、必要な情報を求めてファイルシステムをスキャンするスケジュールされたタスクを設定し、必要な情報を含むデータベース (たとえば sqlite3 を使用) を作成し、ファイルをすばやく見つけられるように inode 番号のインデックスを作成することが最善策です。


例:

#!/bin/bash

# Generate an index file 

# 
SCAN_DIRECTORY=/
DB_DIRECTORY=~/my-sqlite-databases
if [ ! -d ${DB_DIRECTORY} ] ; then
    mkdir ${DB_DIRECTORY}
fi

# Remove any old database - or use one created with a filename based on the date
rm ${DB_DIRECTORY}/files-index.db

(
# Output a command to create a table file_info in the database to hold the information we are interested in
echo 'create table file_info ( inode INTEGER, filepath, filename, numlinks INTEGER, size INTEGER);'

# Use find to scan the directory and locate all the objects - saving the inode, file path, file name, number of links and file size
# This could be reduced to just the inode, file path and file name ... if you are looking for files with multiple links the numlinks is useful (select * from file_info where numlinks > 1)

# Find output formats
#
# %i = inode
# %h = path to file (directory path)
# %f = filename (no directory path)
# %n = number of hard links
# %s = size

# Use find to generate the SQL commands to add the data to the database table.

find $SCAN_DIRECTORY -printf "insert into file_info (inode, filepath, filename, numlinks, size) values ( %i, '%h', '%f', %n, %s);\n"

# Finally create an index on the inode number so we can locate values quickly

echo 'create index inode_index on file_info(inode);'

# Pipe all the above commands into sqlite3 and have sqlite3 create and populate a database
) | sqlite3 ${DB_DIRECTORY}/files-index.db

# Once you have this in place, you can search the index for an inode number as follows

echo 'select * from file_info where inode = 1384238234;' | sqlite3 ${DB_DIRECTORY}/files-index.db

答え4

fsdb コマンドを調べるといいでしょう。これはほとんどの Unix に存在し、Linux でもどこかで利用できるはずです。これはファイルのコア内 inode 構造にアクセスできる強力なコマンドなので、注意してください。構文も非常に簡潔です。

AIX 用の fsdb

Solaris 上の fsdb 再リンク ファイル

fsdbでは実際にinodeのファイル名を見つけることはできませんが、する指定したときに inode に直接アクセスできるようにします。つまり、ファイル自体 (または少なくともデータ ブロック ポインタ) に「ポート」するので、その点では find よりも高速です ;-)。
質問では、ファイルで何をしたいのかが指定されていません。NFS ファイル ハンドルをデコードしているのでしょうか?

sc. スク。

関連情報