Почему find -inum перебирает все дерево файловой системы?

Почему find -inum перебирает все дерево файловой системы?

Меня удивляет, что find выполняет итерацию/проход по всей файловой системе, когда я делаю простую

find -inum 12345

Без дополнительной информации мне кажется, что должны быть гораздо более простые способы узнать все файлы с этим конкретным инодом 12345 (который здесь просто является заполнителем)?

Может быть, есть еще лучший способ для этого? Такой, который не требует проверки всей структуры каталогов файловой системы, просто чтобы узнать, какие имена файлов связаны с inode?

обновлять

Есть еще один вопрос, касающийся этой проблемы Быстро найти, какой файл(ы) принадлежит определенному номеру inode но с намерением найти лучший (более быстрый путь).

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

Тем не менее, кажется довольно странным, что какая-либо файловая система могла бы столкнуться с такой проблемой, сообщая все имена файлов inode (по крайней мере, привилегированному rootпользователю)

Файловая система, для которой я больше всего хотел бы получить ответ на этот вопрос (если это имеет значение), — это ext4.

решение1

Очень простая причина заключается в том, что, по крайней мере, для файловых систем типа ext2/ext3/ext4 имена файлов хранятся череззаписи каталогаданные хранятся в файлах типа каталога.

Это означает, что файлы типа directory имеют более или менее сложную систему хранения имен файлов (файлов внутри каталога) и инодов, которые ведут к данным этих файлов.

Несколько упрощенно (ext3/4 используют улучшения хэш-таблиц для ускорения обхода дерева каталогов и т. д.) это выглядит примерно так:

## filenames ##    ## inode-numbers ##
filename1            0123
filename2            01242
anotherfilename      3313
yetanotherfilename   11233

По сути, имена файловпроисходит только внутри данных, относящихся к файлам direcotry ине хранятся нигде в метаданныхфайловая система хранитдля/из инодов. Поэтому единственный способ получить имена файлов, связанные с номером inode, — это просмотреть все записи каталога всех файлов каталога.

решение2

Вы написали:

Меня удивляет, что find выполняет итерацию/проход по всей файловой системе, когда я выполняю простую команду find -inum 12345

findпо определению выполняет обход дерева, начиная с указанного каталога или каталогов, при этом начальным каталогом по умолчанию является ..

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

Существуют более эффективные способы найти все файлы с заданным номером inode - fsdb, debugfs, и ncheckв ответе, на который вы ссылаетесь, - но findдля этого необходимо выполнить обход дерева из-застандарты. Обратите внимание, что если искомый вами индексный дескриптор имеет только одну ссылку, вы можете предоставить findвозможность -quit(если она поддерживается) завершить обход дерева после первого совпадения.

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

  • В индексном дескрипторе файла содержится множество фрагментов информации, но «имя или имена файла» и «каталог или каталоги, содержащие файл» среди них нет.
  • Структура каталога в большинстве файловых систем Unix очень проста: он содержит только список записей, каждая из которых представляет собой пару (номер инода, имя файла).
  • Чтобы найти каталог или каталоги, содержащие inode 12345, и имя или имена, по которым эти каталоги ссылаются на него, в большинстве файловых систем Unix эти команды должны просматривать каждую запись каждого каталога в файловой системе, пока не найдут все соответствующие записи. Inode файладелаетсодержат количество записей каталога, которые на него ссылаются, чтобы они могли прекратить поиск, как только найдут указанное количество записей.
  • Напротив, поиск имени каталога гораздо эффективнее, поскольку каждый каталог содержит номер inode своего родительского каталога, ..поэтому для поиска соответствующей записи нужно искать только этот один каталог. (Есть одно исключение: корневой каталог файловой системы имеет запись, ..которая указывает на этот же каталог.)

решение3

Более простым ответом может быть аналогия.

Представьте себе, что вы ищете в телефонной книге номер телефона, а не имя.

Связанный контент