Я знаю такую команду:
find /path/to/mountpoint -inum <inode number>
но это очень медленный поиск, я чувствую, что должен быть более быстрый способ сделать это. Кто-нибудь знает более быстрый способ?
решение1
Для файловой системы ext4 можно использовать, debugfs
как в следующем примере:
$ 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), содержащую нужную вам информацию, и создать индекс по номеру инода для быстрого поиска файла(ов).
Пример:
#!/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
Вы можете взглянуть на команду fsdb, которая есть на большинстве Unix-систем и, я уверен, доступна где-то для Linux. Это мощная команда, позволяющая вам получить доступ к структуре inode файлов в ядре, так что будьте осторожны. Синтаксис также очень лаконичен.
Файл перелинковки fsdb на Solaris
Хотя fsdb на самом деле не позволит вам узнать имя файла inode, онделаетпозволяют вам напрямую обращаться к inode, когда вы его указываете, по сути "перенося" вас в сам файл (или, по крайней мере, указатели на его блоки данных), так что в этом отношении это быстрее, чем find ;-).
Ваш вопрос не уточняет, что вы хотите сделать с файлом. Вы, случайно, не декодируете дескрипторы файлов NFS?
подкожно.