Trouvez rapidement quel fichier appartient à un numéro d'inode spécifique

44

Je connais cette commande:

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

mais c’est une recherche très lente, j’ai le sentiment qu’il doit y avoir un moyen plus rapide de le faire. Est-ce que quelqu'un connaît une méthode plus rapide?

Alex
la source
C'est la première fois que je vois une recherche utilisant inode. Quand avez-vous besoin de rechercher par inode?
Coren
@Coren - il est couramment utilisé si vous avez un fichier avec, par exemple, un "-" devant. Vous pouvez faire ls -li pour en trouver l’inode, puis: find. -inum <inode> -exec rm -i {} \; Il s’agit d’une approche à la ceinture et aux brassards qui vous permet de supprimer le fichier. Bien sûr, vous pouvez aussi "rm - -filename", ou rm ./-filename, ou rm "-filename".
swisscheese
2
@Coren avec selinux, les messages de journalisation incluent l'inode, mais pas le chemin complet. Il faut donc rechercher l’inode pour trouver le fichier référencé. (c'est de toute façon mon cas d'utilisation)
Patrick
1
@Coren Par exemple, lorsqu'un fichier contient plusieurs liens physiques, vous avez remarqué que le contenu est obsolète et souhaitez supprimer le fichier, mais vous n'avez trouvé qu'un seul nom de fichier et souhaitez supprimer les autres.
Gilles 'SO- arrête d'être méchant'
2
Il suffit d'utiliser find / -inum <inode>. Il est beaucoup plus portable que debugfset fonctionne aussi de manière beaucoup plus fiable (il peut trouver des chemins n’appartenant pas à des fichiers sur le disque dur, comme des périphériques, par exemple).
7hé.tk le

Réponses:

33

Pour un système de fichiers ext4, vous pouvez utiliser debugfscomme dans l'exemple suivant:

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

La réponse n'est pas immédiate, mais semble être meilleure que find.
Le résultat obtenu peut être facilement analysé pour obtenir le nom du fichier.

enzotib
la source
J'aurais probablement dû spécifier le type de système de fichiers. Je ne pensais pas que la méthode à suivre serait différente selon les systèmes de fichiers. J'utilise XFS. Par conséquent, bien que votre réponse soit correcte, elle ne m'aidera pas spécifiquement.
Alex
6

btrfs

man btrfs-inspect-internal dit:

   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

Exemple:

  • sudo btrfs inspect-internal inode-resolve 15380 /home
Tom Hale
la source
0

Vous pouvez regarder la commande fsdb, trouvée sur la plupart des Unices, et disponible quelque part pour Linux, j'en suis sûr. Il s’agit d’une commande puissante vous permettant d’accéder à la structure de fichiers inode du noyau, soyez donc prudent. La syntaxe est également très concise.

fsdb pour AIX

fsdb relier le fichier sous Solaris

Bien que fsdb ne vous laisse pas réellement découvrir le nom de fichier de l’inode, il vous permet d’accéder directement à l’inode lorsque vous le spécifiez , ce qui vous permet en principe de vous «porter» vers le fichier lui-même (ou au moins ses pointeurs de bloc de données). plus rapide à cet égard que la découverte ;-).
Votre question ne précise pas ce que vous voulez faire avec le fichier. Êtes-vous peut-être en train de décoder les poignées de fichiers NFS?

Caroline du Sud.

fromage suisse
la source
Eh bien, je ne pensais pas que ce que j'allais faire avec l'information était pertinent pour ma question, alors je l'ai laissé de côté. Dans mon cas, c'était simplement une question de curiosité; ma défragmentation xfs_fsr détermine les inodes qu’elle défragmente, et l’une des deux était extrêmement fragmentée (plus de 5 000 étendues) et j’étais juste curieux de savoir de quel fichier il s’agissait. findça marche, c'est tellement lent.
Alex
J'essaie de résoudre un problème où ma machine virtuelle rhel effectue un fsck complet (20 minutes!) À chaque démarrage et tout ce que j'ai à faire est le numéro d'inode indiqué dans / var / opt / messages comme étant défectueux. (Ceci dit, find -inum ne l'a pas trouvé)