inode番号からファイルのパスを得る方法を教えてください。


↓のOSにてお願いします。pythonなどの言語で出来ると助かります。
* Mac OS X Snow Leopard
* Linux

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/08/16 00:00:27
  • 終了:2010/08/23 00:05:02

回答(1件)

id:dolduke No.1

dolduke回答回数9ベストアンサー獲得回数12010/08/16 05:03:35

ポイント60pt

UNIX 系のファイルシステムは基本的に上から下にたどるようにできているので、対象ファイルが存在する事が分かっている場所から再起的に探す事になると思います。find コマンドは -inum inode_number オプションを持っているので、これを利用するのが簡単かも知れません。find の最初の引数でどこから検索するかを指定するので、ここが大きいファイルシステムの上の方のディレクトリだと操作に時間がかかるかもしれません。想定される場所が限定できるなら、なるべく具体的な場所から探した方がよいでしょう。python から呼ぶ必要があるのであれば os.popen, os.popen2 を介して呼び、標準出力の結果をえるという事も可能です。


例:inode 番号 1657248 のファイルのパスを /private/etc 以下で探して表示する

$ find /private/etc -inum 1657248


find を起動したくないという事であれば、同様の処理を python で書く事も可能です。

#!/usr/bin/env python

import os
from stat import *

def find_inum(inum, dir_path):
  for f in os.listdir(dir_path):
    fpath = os.path.join(dir_path, f)
    statrec = os.stat(fpath)
    mode = statrec[ST_MODE]
    ino  = statrec[ST_INO]
    if ino == inum:
      print fpath
      return True
    if S_ISDIR(mode):
      if find_inum(inum, fpath):
        break
  return False

based = '/private/etc'   # example
target_inum = 1657248 # example

if __name__ == '__main__':
  find_inum(target_inum, based)

http://www.python.jp/doc/2.5/lib/os-file-dir.html#l2h-2675


あるディレクトリ以下の inode とパスの一覧をえて、それを検索する方法も考えられます。

ここでは一覧を得るコマンド部分の例を示します。


対象を通常ファイルのみにする場合(-type f でファイルに限定):

$ find /private/etc -type f | xargs ls -i


ディレクトリも含める場合(ディレクトリ自身を表示するため ls に -d を指定):

$ find /private/etc | xargs ls -di


カーネルには DNLC, dcache といったデータ構造があって、これを使うとより速く見つける事も可能ですが、だいぶ面倒になりますし、そもそもキャッシュなので、最近使っていないファイルの情報はありません。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません