Finden Sie schnell heraus, welche Datei(en) zu einer bestimmten Inode-Nummer gehört/gehören

Finden Sie schnell heraus, welche Datei(en) zu einer bestimmten Inode-Nummer gehört/gehören

Ich kenne diesen Befehl:

find /path/to/mountpoint -inum <inode number>

aber die Suche ist sehr langsam. Ich denke, es muss einen schnelleren Weg dafür geben. Kennt jemand eine schnellere Methode?

Antwort1

Für ein ext4-Dateisystem können Sie debugfsFolgendes wie im folgenden Beispiel verwenden:

$ sudo debugfs -R 'ncheck 393094' /dev/sda2 2>/dev/null
Inode   Pathname
393094  /home/enzotib/examples.desktop

Die Antwort kommt nicht sofort, scheint aber schneller zu sein als find.

Die Ausgabe debugfskann leicht analysiert werden, um die Dateinamen zu erhalten:

$ sudo debugfs -R 'ncheck 393094' /dev/sda2 | cut -f2 | tail -n2 > filenames

Antwort2

btrfs

man btrfs-inspect-internalsagt:

   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

Beispiel:

  • sudo btrfs inspect-internal inode-resolve 15380 /home

Antwort3

Das Grundproblem besteht darin, dass es in den meisten Dateisystemen, die in diese Richtung arbeiten, keinen Index gibt. Wenn Sie so etwas häufig tun müssen, richten Sie am besten eine geplante Aufgabe ein, die das Dateisystem nach den benötigten Informationen durchsucht, erstellen Sie eine Datenbank (z. B. mit sqlite3), die die benötigten Informationen enthält, und erstellen Sie einen Index für die Inode-Nummer, um die Datei(en) schnell zu finden.


Beispiel:

#!/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

Antwort4

Sie könnten sich den Befehl fsdb ansehen, der auf den meisten Unix-Systemen zu finden ist und sicher auch irgendwo für Linux verfügbar ist. Dies ist ein leistungsstarker Befehl, mit dem Sie auf die Inode-Struktur von Dateien im Kern zugreifen können. Seien Sie also vorsichtig. Die Syntax ist auch sehr knapp.

fsdb für AIX

fsdb-Relink-Datei unter Solaris

Obwohl fsdb den Dateinamen des Inodes nicht ermitteln kann,tutermöglicht Ihnen den direkten Zugriff auf den Inode, wenn Sie ihn angeben, und „portiert“ Sie im Wesentlichen zur Datei selbst (oder zumindest zu deren Datenblockzeigern), sodass es in dieser Hinsicht schneller ist als das Suchen ;-).
Ihre Frage gibt nicht an, was Sie mit der Datei tun möchten. Dekodieren Sie vielleicht NFS-Dateihandles?

sc.

verwandte Informationen