Encontre rapidamente quais arquivos pertencem a um número de inode específico

Encontre rapidamente quais arquivos pertencem a um número de inode específico

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 debugfscomo 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 debugfspode 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-internaldiz:

   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.

fsdb para AIX

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.

informação relacionada