나는 다음 명령을 알고 있습니다.
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
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 구조에 액세스할 수 있게 해주는 강력한 명령이므로 주의하세요. 구문도 매우 간결합니다.
fsdb에서는 실제로 inode의 파일 이름을 검색할 수 없지만하다inode를 지정할 때 직접 inode에 액세스할 수 있도록 허용하면 기본적으로 파일 자체(또는 최소한 데이터 블록 포인터)로 "포팅"되므로 해당 측면에서 find보다 빠릅니다 ;-).
귀하의 질문은 파일로 무엇을 하려는지 지정하지 않습니다. NFS 파일 핸들을 디코딩할 수 있습니까?
SC.