Beagle использует очень интересный подход с inotify. Он запускается, устанавливает наблюдение за родительским каталогом и запускает другой поток, который выполняет рекурсивное сканирование. При обращении к большему количеству каталогов родитель видит их и добавляет больше часов, наблюдая за тем, что он уже знает.
Итак, когда оно началось, вы просматриваете все дерево довольно дешево (один просмотр на каталог) и индексируете все это. Это также помогает гарантировать, что ни один файл не будет «пропущен» во время сканирования.
Итак, это большая часть вашей битвы. Обычно программы поиска FS достигают своей вялой точки при индексации, например, «updatedb».
Что касается хранения индекса, я бы не хотел разделять его по каталогам. По сути, вы будете вызывать stat () для каждого символа в массиве имен файлов. Например, some-очень-long-shared-object-name.so.0 будет одним вызовом stat () для каждого символа в имени. Вы можете попробовать использовать хорошо спроектированную базу данных SQLite3.
Я работаю над чем-то очень похожим, программой, обеспечивающей немного более дешевые средства аудита для сертификации PCI (процессор кредитных карт), без использования ловушек аудита ядра.