Дивлячись на Дельфіна з Baloo, схоже, шукає метадані кожного файлу в його пошуковому домені, навіть якщо ви робите простий пошук імені файлів. Коли я простежити file.so
процес, я бачу виклики до lstat
, getxattr
і getxattr
знову для кожного файлу, і навіть для ..
записів. Ці системні виклики отримують метадані про файл, який зберігається в іншому місці від імені файлу (ім'я файлу зберігається у вмісті каталогів, але метадані знаходяться у inode ). Запит на метадані файлу кілька разів є дешевим, оскільки дані знаходяться в кеш-диску диска, але може бути значна різниця між запитом метаданих і не запитом метаданих.
find
набагато розумніший. Він намагається уникати зайвих системних дзвінків. Він не дзвонить, getxattr
оскільки не здійснює пошук на основі розширених атрибутів. Під час проходження каталогу, можливо, знадобиться викликати lstat
невідповідні імена файлів, тому що це може бути підкаталог для рекурсивного пошуку ( lstat
це системний виклик, який повертає метадані файлів, включаючи тип файлу, такий як звичайний / каталог / symlink /…). Однак find
є оптимізація: вона знає, скільки підкаталогів має каталог з його кількості посилань , і він припиняє дзвінки, lstat
як тільки знає, що пройшов усі підкаталоги. Зокрема, у довідковому каталозі (каталог без підкаталогів)find
перевіряє лише імена, а не метадані. Крім того, деякі файлові системи зберігають копію типу файлу у записі каталогу, так що find
навіть не потрібно дзвонити, lstat
якщо це єдина інформація, яка йому потрібна.
Якщо ви працюєте find
з параметрами, які потребують перевірки метаданих, вона здійснюватиме більше lstat
дзвінків, але він все одно не здійснюватиме lstat
виклик у файлі, якщо йому не потрібна інформація (наприклад, тому що файл виключений попередньою умовою відповідність назви).
Я підозрюю, що інші інструменти пошуку GUI, які винаходять find
колесо, менш розумні, ніж утиліта командного рядка, яка зазнала десятиліть оптимізації. Принаймні, дельфін досить розумний, щоб використовувати базу даних locate, якщо ви шукаєте "скрізь" (з обмеженням, яке в інтерфейсі не зрозуміло, що результати можуть бути застарілими).