특정 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

BTFS

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 사용) 인덱스를 생성하는 것입니다. 파일의 인덱스 노드 번호를 빠르게 찾는 데 사용됩니다.


예:

#!/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

대부분의 Unices에서 사용할 수 있는 fsdb 명령을 볼 수 있으며 Linux에서도 사용할 수 있다고 확신합니다. 이는 파일의 핵심 inode 구조에 액세스할 수 있게 해주는 강력한 명령이므로 주의하세요. 구문도 매우 간결합니다.

AIX용 fsdb

Solaris의 fsdb relink 파일

fsdb에서는 실제로 inode의 파일 이름을 검색할 수 없지만하다inode를 지정할 때 직접 inode에 액세스할 수 있도록 허용하면 기본적으로 파일 자체(또는 최소한 데이터 블록 포인터)로 "포팅"되므로 해당 측면에서 find보다 빠릅니다 ;-).
귀하의 질문은 파일로 무엇을 하려는지 지정하지 않습니다. NFS 파일 핸들을 디코딩할 수 있습니까?

SC.

관련 정보