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

44

Ich kenne diesen Befehl:

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

aber es ist eine sehr langsame Suche, ich glaube, es muss einen schnelleren Weg geben, um dies zu tun. Kennt jemand eine schnellere Methode?

Alex
quelle
Ich sehe zum ersten Mal eine Suche mit inode. Wann müssen Sie nach Inode suchen?
Coren
@Coren - wird häufig verwendet, wenn Sie eine Datei mit einem "-" voranstellen. Sie können ls -li verwenden, um die Inode zu finden, dann: find. -inum <inode> -exec rm -i {} \; Dies ist ein Ansatz, mit dem Sie sicherstellen können, dass Sie die Datei entfernen können. Natürlich können Sie auch 'rm - -Dateiname' oder rm ./-Dateiname oder rm "-Dateiname" eingeben.
Swisscheese
2
@ Coren mit Selinux, Protokollnachrichten enthalten den Inode, aber nicht den vollständigen Pfad. Sie müssen also nach dem Inode suchen, um die Datei zu finden, auf die verwiesen wird. (das ist sowieso mein Anwendungsfall)
Patrick
1
@Coren Wenn eine Datei beispielsweise mehrere feste Links enthält, haben Sie festgestellt, dass der Inhalt veraltet ist und die Datei löschen möchte, aber Sie haben nur einen der Dateinamen gefunden und möchten die anderen löschen.
Gilles 'SO- hör auf böse zu sein'
2
Verwenden Sie einfach find / -inum <inode>. Es ist viel portabler als debugfsund arbeitet auch viel zuverlässiger (es kann Pfade finden, die nicht zu Dateien auf der Festplatte gehören, wie zum Beispiel Geräte).
7heo.tk

Antworten:

33

Für ein ext4-Dateisystem können Sie debugfsFolgendes verwenden:

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

Die Antwort ist nicht unmittelbar, scheint aber besser zu sein als find.
Die erhaltene Ausgabe kann leicht analysiert werden, um den Dateinamen zu erhalten.

Enzotib
quelle
Ich hätte wahrscheinlich den Dateisystemtyp angeben sollen. Mir ist nicht in den Sinn gekommen, dass die Vorgehensweise für verschiedene Dateisysteme unterschiedlich ist. Ich verwende XFS. Obwohl ich sicher bin, dass Ihre Antwort korrekt ist, hilft es mir nicht weiter.
Alex
6

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
Tom Hale
quelle
0

Sie können sich den Befehl fsdb ansehen, der auf den meisten Unices zu finden ist und der sicher irgendwo für Linux verfügbar ist. Dies ist ein leistungsfähiger 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-Datei unter Solaris erneut verknüpfen

Mit fsdb können Sie den Dateinamen des Inodes zwar nicht ermitteln, Sie können jedoch direkt auf den Inode zugreifen, wenn Sie ihn angeben, und Sie im Wesentlichen auf die Datei selbst "portieren" (oder zumindest auf die Datenblockzeiger), sodass dies der Fall ist schneller in dieser Hinsicht als der Fund ;-).
Ihre Frage gibt nicht an, was Sie mit der Datei tun möchten. Dekodieren Sie möglicherweise NFS-Dateihandles?

sc.

schweizer Käse
quelle
Nun, ich dachte nicht, was ich mit den Informationen anfangen würde, die für meine Frage relevant sind, also habe ich sie weggelassen. In meinem Fall war es nur eine Frage der Neugier; Meine xfs_fsr-Defragmentierung spuckt aus, welche Inodes sie defragmentiert, und eine ist extrem fragmentiert (über 5000 Speicherbereiche), und ich war nur neugierig, welche Datei es ist. findfunktioniert, es ist nur so langsam.
Alex
Ich versuche ein Problem zu beheben, bei dem mein Rhel-VM jeden Startvorgang (20 Minuten!) Ausführt und ich nur die Inode-Nummer angeben muss, die in / var / opt / messages als fehlerhaft gemeldet wurde. (Allerdings hat find -inum es nicht wirklich gefunden)