Я пытаюсь найти файл, который не существует в моем домашнем каталоге и во всех подкаталогах.
find ~/ -name "bogus"
дает мне эту информацию через несколько секунд, но файловому менеджеру KDEdolphin
понадобилось почти 3 минуты, чтобы сделать то же самое. Это соответствует моему предыдущему опыту работы с GNOMEbeagle
.
Как find
удается делать то же самое очень быстро, в то время как графический поиск (который более интуитивно понятен в использовании, чем параметры командной строки) отстает?
find
performance
dolphin
красный
источник
источник
locate
чаще, чемfind
это, и это быстрее в огромной папкеlocate
он действительно хорош для поиска файлов, это немного OT, потому что он использует совершенно другой подход:find
инструменты GUI, такие какDolphin
, обходят дерево файлов по требованию, в то времяlocate
как используют ранее созданную структуру индекса.Ответы:
Рассматривая 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 при поиске «везде» (с ограничением, которое не ясно в пользовательском интерфейсе, что результаты могут быть устаревшими).источник
2 + number of sub-directories.
Это работает для файловых систем, которые реализуют ошибку проектирования из файловой системы UNIX V7, но не для всех файловых систем, поскольку это не является требованием POSIX. , Если вы хотите получить полезный номер производительности для GNU make, вам нужно указать-noleaf
порядок, чтобы GNU make вел себя правильно.find
возможно, была эта ошибка давным-давно, но я сомневаюсь, что вы найдете случай, когда вам нужно указать-noleaf
вручную. AFAICT, по крайней мере в Linuxgetdents()
(и readdir ()) сообщает, какие файлы являются файлами каталогов в UDF, ISO-9660, btrfs, которые не имеют вещественных.
или..
записей иfind
ведут себя там нормально. Знаете ли вы об одном случае, когда GNUfind
демонстрирует проблему?find
. И в любом случае,strace -v
показывает, чтоgetdents()
правильно возвращает d_type = DT_DIR для каталогов, поэтому в GNU find не нужно использовать трюк с подсчетом ссылок.