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

44

Eu conheço este comando:

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

mas é uma pesquisa muito lenta, sinto que deve haver uma maneira mais rápida de fazer isso. Alguém conhece um método mais rápido?

Alex
fonte
Esta é a primeira vez que vejo uma pesquisa usando inode. Quando você precisa procurar por inode?
Coren
@ Coren - é comumente usado se você tiver um arquivo com, digamos, um "-" na frente. Você pode fazer ls -li para encontrar o inode, e então: find. -inum <inode> -exec rm -i {} \; Essa é uma abordagem de cinto e braçadeira para garantir que você possa remover o arquivo. Obviamente, você também pode 'rm - -filename', ou rm ./-filename, ou rm "-filename".
31512 swisscheese
2
@Coren com selinux, as mensagens de log incluem o inode, mas não o caminho completo. Portanto, você deve procurar o inode para encontrar o arquivo que está sendo referido. (que é o meu caso de uso de qualquer maneira)
Patrick
1
@Coren Por exemplo, quando um arquivo tem vários links físicos, você percebeu que o conteúdo está obsoleto e deseja excluir o arquivo, mas encontrou apenas um dos nomes do arquivo e deseja excluir os outros.
Gilles 'SO- stop be evil' em
2
Apenas use find / -inum <inode>. É muito mais portátil do que debugfse também funciona com muito mais confiabilidade (ele pode encontrar caminhos que não pertencem a arquivos no disco rígido, como dispositivos, por exemplo).
7heo.tk

Respostas:

33

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 melhor que find.
A saída obtida pode ser facilmente analisada para obter o nome do arquivo.

enzotib
fonte
Eu provavelmente deveria ter especificado o tipo de sistema de arquivos. Não me ocorreu que o método de fazer essas coisas seria diferente para diferentes sistemas de arquivos. Estou usando o XFS, portanto, enquanto tenho certeza de que sua resposta está correta, isso não me ajudará especificamente.
30512 Alex
6

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
Tom Hale
fonte
0

Você pode olhar para o 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 de inode in-core dos arquivos, portanto, tenha cuidado. A sintaxe também é muito concisa.

fsdb para AIX

arquivo de re-link do fsdb no Solaris

Embora o fsdb não permita que você descubra o nome do arquivo do inode, ele permite que você acesse diretamente o inode quando o especificar, em essência "portando" você para o próprio arquivo (ou pelo menos para os indicadores de bloco de dados). mais rápido nesse aspecto do que a descoberta ;-).
Sua pergunta não especifica o que você deseja fazer com o arquivo. Você está decodificando identificadores de arquivo NFS?

sc.

queijo suíço
fonte
Bem, não achei que o que eu ia fazer com a informação fosse relevante para a minha pergunta, então deixei de fora. No meu caso, era apenas uma questão de curiosidade; minha desfragmentação xfs_fsr cospe quais inodes desfragmentam, e uma era extremamente fragmentada (mais de 5000 extensões) e fiquei curioso para saber qual arquivo era. findfunciona, é tão lento.
30412 Alex
Estou tentando corrigir um problema em que meu rhel vm faz um fsck completo (20 minutos!) A cada inicialização e tudo o que preciso fazer é o número de inode relatado em / var / opt / messages como defeituoso. (Dito isto, encontrar -inum não chegou a encontrá-lo)