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 debugfs
como 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 debugfs
se 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-internal
dice:
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 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.