Encuentre rápidamente qué archivos pertenecen a un número de inodo específico

Encuentre rápidamente qué archivos pertenecen a un número de inodo específico

Conozco este comando:

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

pero es una búsqueda muy lenta, siento que tiene que haber una manera más rápida de hacerlo. ¿Alguien conoce un método más rápido?

Respuesta1

Para un sistema de archivos ext4, puede utilizar debugfscomo en el siguiente ejemplo:

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

La respuesta no es inmediata, pero parece ser más rápida que find.

La salida de debugfsse puede analizar fácilmente para obtener los nombres de los archivos:

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

Respuesta2

btrfs

man btrfs-inspect-internaldice:

   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

Ejemplo:

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

Respuesta3

El problema básico es que no existe un índice en la mayoría de los sistemas de archivos que funcionan en esta dirección. Si necesita hacer este tipo de cosas con frecuencia, lo mejor que puede hacer es configurar una tarea programada que escanee el sistema de archivos en busca de la información que necesita, crear una base de datos (usando sqlite3, por ejemplo) que tenga la información que necesita y crear un índice en el número de inodo para localizar archivos rápidamente.


Ejemplo:

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

Respuesta4

Puede consultar el comando fsdb, que se encuentra en la mayoría de los Unices y, estoy seguro, disponible en algún lugar para Linux. Este es un comando poderoso que le permite acceder a la estructura interna de inodos de los archivos, así que tenga cuidado. La sintaxis también es muy concisa.

fsdb para AIX

fsdb vuelve a vincular el archivo en Solaris

Si bien fsdb en realidad no le permitirá descubrir el nombre de archivo del inodo,hacele permite acceder directamente al inodo cuando lo especifica, en esencia, "transfiriéndolo" al archivo en sí (o al menos a sus punteros de bloque de datos), por lo que es más rápido en ese sentido que buscar ;-).
Su pregunta no especifica qué quiere hacer con el archivo. ¿Quizás estás decodificando identificadores de archivos NFS?

Carolina del Sur.

información relacionada