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

44

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

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

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

Alex
источник
Я впервые вижу поиск с использованием 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.
Полученный вывод может быть легко проанализирован для получения имени файла.

enzotib
источник
Вероятно, мне следовало указать тип файловой системы. Мне не приходило в голову, что метод выполнения этих вещей будет различным для разных файловых систем. Я использую 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 на самом деле не нашел)