Рассматривая Dolphin с Baloo, он ищет метаданные каждого файла в своей области поиска, даже если вы выполняете простой поиск по имени файла. Когда я отслеживаю file.so
процесс, я вижу вызовы lstat
, getxattr
и getxattr
снова для каждого файла, и даже для ..
записей. Эти системные вызовы извлекают метаданные о файле, который хранится в другом месте, чем имя файла (имя файла хранится в содержимом каталога, но метаданные находятся в inode ). Многократный запрос метаданных файла является дешевым, поскольку данные будут находиться в кеше диска, но между запросом метаданных и отказом от метаданных может быть существенная разница.
find
гораздо умнее Он пытается избежать ненужных системных вызовов. Он не будет вызываться, getxattr
потому что не выполняет поиск по расширенным атрибутам. Когда он пересекает каталог, ему может потребоваться вызвать lstat
несоответствующие имена файлов, потому что это может быть подкаталог для рекурсивного поиска ( lstat
это системный вызов, который возвращает метаданные файла, включая тип файла, такой как обычный / directory / symlink /…). Тем find
не менее, имеет оптимизацию: он знает, сколько подкаталогов у каталога, по количеству ссылок , и останавливает вызов, lstat
как только узнает, что он прошел все подкаталоги. В частности, в листовом каталоге (каталог без подкаталогов),find
проверяет только имена, а не метаданные. Кроме того, некоторые файловые системы хранят копию типа файла в записи каталога, поэтому find
даже не нужно вызывать ее, lstat
если это единственная информация, которая ему нужна.
Если вы работаете find
с опциями, которые требуют проверки метаданных, он будет делать больше lstat
вызовов, но он все равно не будет делать lstat
вызов файла, если ему не нужна информация (например, потому что файл исключен предыдущим условием). совпадение по названию).
Я подозреваю, что другие инструменты поиска с графическим интерфейсом, которые изобретают find
велосипед, также менее умны, чем утилита командной строки, которая подверглась десятилетиям оптимизации. Dolphin, по крайней мере, достаточно умен, чтобы использовать базу данных locate при поиске «везде» (с ограничением, которое не ясно в пользовательском интерфейсе, что результаты могут быть устаревшими).