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 debugfs
Folgendes 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 debugfs
kann 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-internal
sagt:
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-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.