Как работает поиск файла (найти) или автозаполнение?


8

Я являюсь пользователем Windows и прихожу из Windows со всеми временами индексации и вечного ожидания при поиске файлов, я удивляюсь, как быстро работает поиск или автозаполнение ( насколько я знаю) в linux.

Есть ли в фоновом режиме индексирование или как это достигается? У меня все еще достаточно чистая установка, так что, возможно, со временем все будет плохо, но в Windows, когда вы хотите выполнить поиск в папке, которая не проиндексирована, вам придется подождать несколько секунд.

Ответы:


18

Я нахожу удивительным, как быстро работает поиск или автозаполнение (что я знаю) работает в Linux. ... Есть ли какая-то индексация в фоновом режиме или как это достигается?

На самом деле это два совершенно разных вопроса.

locateиспользует индекс (хранит его в slocate /var/lib/slocate/), который обновляется ночным cronзаданием. Эта ночная работа обычно выполняется примерно в 1 или 2 часа ночи по местному времени и полностью сканирует всю систему (включая все подключенные диски). Полученный индекс - это просто список имен файлов.

Автозаполнение обрабатывается вашей оболочкой. Большинство систем используют bash, так bash-completionчто это коллекция скриптов, которые управляют, как это работает. ( zshимеет коллекцию с аналогичным именем, и большинство других оболочек имеют встроенную форму завершения). При Tabнажатии оболочка запускает скрипт, который решает, основываясь на том, что вы уже набрали, что именно нужно быть законченным. Затем скрипт генерирует список возможных дополнений, который может быть или не быть списком файлов в текущем каталоге или списком исполняемых файлов в вашем $PATH. Команда locateобычно не используется для этого.


1
Спасибо!
Понятно

Greyfade навсегда разрушил магию -_-
Майкл Мрозек

@ Майкл Мрозек: Извините. :(
Greyfade

Оболочка запускает сценарий звучит не на 100% правильно, при реализации оболочки люди не должны ошибочно думать, что им следует писать внешние сценарии. Это просто подпрограмма в самом коде, она может или не может обращаться к внешним файлам для удобства настройки, но простое встроенное завершение работает хорошо.
Аки

1
@NabinKhadka Так как мой ответ был написан, я думаю, что Ubuntu перешел на другой locateсервис. Я не знаю, какой из них - я не пользуюсь Ubuntu, - но на ум приходит mlocate. Проверьте /etc/updatedb.conf. Он может иметь путь по умолчанию для любого locateинструмента, который у вас есть.
Greyfade

5

Обычно locate использует индекс, который генерируется один раз в день с помощью задания cron (например, /etc/cron.daily/mlocate в моей системе). Это ничего не делает, в основном полный обход файловой системы с некоторыми оптимизациями и построение структуры данных индекса.

Оболочки используют, вероятно, некоторое внутреннее кэширование для завершения команд, но не используют файл глобального индекса. Кроме того, обычно ядра Unix поддерживают кэш-память, т. Е. \ Они кэшируют информацию каталога файлов, используемую списками каталогов и т. Д. В памяти (включая статистику несуществующих файлов - что также называется обратным кэшированием).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.