Eu conheço este comando:
find /path/to/mountpoint -inum <inode number>
mas é uma busca muito lenta, sinto que tem que haver uma maneira mais rápida de fazer isso. Alguém conhece um método mais rápido?
Responder1
Para um sistema de arquivos ext4, você pode usar debugfs
como no exemplo a seguir:
$ sudo debugfs -R 'ncheck 393094' /dev/sda2 2>/dev/null
Inode Pathname
393094 /home/enzotib/examples.desktop
A resposta não é imediata, mas parece ser mais rápida que find
.
A saída de debugfs
pode ser facilmente analisada para obter os nomes dos arquivos:
$ sudo debugfs -R 'ncheck 393094' /dev/sda2 | cut -f2 | tail -n2 > filenames
Responder2
btrfs
man btrfs-inspect-internal
diz:
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
Exemplo:
sudo btrfs inspect-internal inode-resolve 15380 /home
Responder3
O problema básico é que não existe índice na maioria dos sistemas de arquivos que funcionam nessa direção. Se você precisa fazer esse tipo de coisa com frequência, sua melhor aposta é configurar uma tarefa agendada que varre o sistema de arquivos em busca das informações necessárias, criar um banco de dados (usando sqlite3, por exemplo) que contenha as informações necessárias e criar um índice em o número do inode para localizar arquivo(s) rapidamente.
Exemplo:
#!/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
Responder4
Você pode dar uma olhada no comando fsdb, encontrado na maioria dos Unices e disponível em algum lugar para Linux, tenho certeza. Este é um comando poderoso que permite acessar a estrutura inode interna dos arquivos, portanto, tome cuidado. A sintaxe também é muito concisa.
arquivo de re-link fsdb no Solaris
Embora o fsdb não permita que você descubra o nome do arquivo do inode, elefazpermitem que você acesse diretamente o inode quando você o especifica, em essência "portando" você para o próprio arquivo (ou pelo menos para os ponteiros do bloco de dados), então é mais rápido nesse aspecto do que encontrar ;-).
Sua pergunta não especifica o que você deseja fazer com o arquivo. Você por acaso está decodificando identificadores de arquivos NFS?
sc.