나는 다음 명령을 알고 있습니다.
find /path/to/mountpoint -inum <inode number>
하지만 검색 속도가 매우 느리기 때문에 더 빠른 방법이 있어야 한다고 생각합니다. 더 빠른 방법을 아는 사람이 있나요?
답변1
debugfs
ext4 파일 시스템의 경우 다음 예와 같이 사용할 수 있습니다 .
$ 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 구조에 액세스할 수 있게 해주는 강력한 명령이므로 주의하세요. 구문도 매우 간결합니다.
fsdb에서는 실제로 inode의 파일 이름을 검색할 수 없지만하다inode를 지정할 때 inode에 직접 액세스할 수 있습니다. 본질적으로 파일 자체(또는 적어도 데이터 블록 포인터)로 "포팅"하므로 find ;-)보다 그 점에서 더 빠릅니다.
귀하의 질문은 파일로 무엇을 하려는지 지정하지 않습니다. NFS 파일 핸들을 디코딩하고 있습니까?
sc.