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

대부분의 Unices에서 발견되고 Linux 어딘가에서 사용 가능한 fsdb 명령을 볼 수 있을 것입니다. 이는 파일의 코어 내부 inode 구조에 액세스할 수 있게 해주는 강력한 명령이므로 주의하세요. 구문도 매우 간결합니다.

AIX용 fsdb

Solaris의 fsdb 재링크 파일

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

sc.

관련 정보