Быстро найти, какие файлы принадлежат конкретному номеру inode


44

Я знаю об этой команде:

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

но это очень медленный поиск, я чувствую, что должен быть более быстрый способ сделать это. Кто-нибудь знает более быстрый метод?


Я впервые вижу поиск с использованием inode. Когда вам нужно искать по иноду?
Корен

@Coren - обычно используется, если у вас есть файл, скажем, «-» впереди. Вы можете выполнить ls -li, чтобы найти его инод, а затем: find. -inum <inode> -exec rm -i {} \; Это подход пояса и браслетов, чтобы гарантировать, что вы можете удалить файл. Конечно, вы также можете использовать «rm -filename» или «rm ./-filename» или «rm -filename».
швейцарский

2
@Coren с selinux, сообщения журнала включают в себя индекс, но не полный путь. Таким образом, вы должны искать индекс, чтобы найти файл, на который ссылаются. (в любом случае это мой вариант использования)
Патрик

1
@Coren Например, когда файл имеет несколько жестких ссылок, вы заметили, что содержимое устарело, и хотите удалить файл, но вы нашли только одно имя файла и хотите удалить остальные.
Жиль "ТАК - перестань быть злым"

2
Просто используйте find / -inum <inode>. Он гораздо более переносим, ​​чем debugfsи работает гораздо надежнее (он может находить пути, которые не принадлежат файлам на жестком диске, например, устройствам).
7heo.tk

Ответы:


33

Для файловой системы ext4 вы можете использовать debugfsкак в следующем примере:

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

Ответ не является немедленным, но, кажется, лучше, чем find.
Полученный вывод может быть легко проанализирован для получения имени файла.


Вероятно, мне следовало указать тип файловой системы. Мне не приходило в голову, что метод выполнения этих вещей будет различным для разных файловых систем. Я использую XFS, поэтому, хотя я уверен, что ваш ответ правильный, он мне не поможет.
Алекс

6

Btrfs

man btrfs-inspect-internal говорит:

   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

Пример:

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

0

Вы можете посмотреть на команду fsdb, найденную в большинстве Unices и доступную где-то для Linux, я уверен. Это мощная команда, позволяющая получить доступ к внутренней структуре файлов inode, поэтому будьте осторожны. Синтаксис также очень лаконичен.

fsdb для AIX

Файл повторной ссылки fsdb в Solaris

Хотя FSDB не будет на самом деле позволит вам открыть имя файла инода, это делает позволяет получить прямой доступ к иноду при указании его, в сущности , «перенос» Вам сам (или по крайней мере это блок данных указатели) файл , так это быстрее в этом отношении, чем найти ;-).
Ваш вопрос не указывает, что вы хотите сделать с файлом. Вы можете расшифровать файловые дескрипторы NFS?

Совет Безопасности ООН


Ну, я не думал, что то, что я собираюсь делать с информацией, имеет отношение к моему вопросу, поэтому я оставил ее. В моем случае это был просто вопрос любопытства; моя дефрагментация xfs_fsr выплевывает, какие inodes это дефрагментирует, и один был чрезвычайно фрагментирован (более 5000 экстентов), и мне было просто интересно, какой это файл findработает, это просто так медленно.
Алекс

Я пытаюсь решить проблему, когда мой rhel vm выполняет полный (20 минут!) Fsck при каждой загрузке, и все, что мне нужно, - это номер инода, указанный в / var / opt / messages как ошибочный. (Сказав это, найти -inum на самом деле не нашел)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.