Быстро найти, какой файл(ы) принадлежит определенному номеру inode

Быстро найти, какой файл(ы) принадлежит определенному номеру inode

Я знаю такую ​​команду:

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 для AIX

Файл перелинковки fsdb на Solaris

Хотя fsdb на самом деле не позволит вам узнать имя файла inode, онделаетпозволяют вам напрямую обращаться к inode, когда вы его указываете, по сути "перенося" вас в сам файл (или, по крайней мере, указатели на его блоки данных), так что в этом отношении это быстрее, чем find ;-).
Ваш вопрос не уточняет, что вы хотите сделать с файлом. Вы, случайно, не декодируете дескрипторы файлов NFS?

подкожно.

Связанный контент