Настройка и работа в Linux

         

Когда locate не катит


Как всегда, отрицательные стороны locate вытекают прямиком из его положительных сторон. Так информация о файлах в базе может устареть с момента последнего обновления, и не соответствовать текущему состоянию файловой системы, некоторые файлы могут быть удалены, некоторые переименованы, другие добавлены. И если с удалением проблем вобщем не возникает, потому что locate после поиска в своей базе проверяет наличие найденных файлов в системе, то с новыми или переименованными файлами locate не дружит, они результатах будут отсутствовать:

$ locate somefile.txt <-- ищем файл somefile.txt которого нет $ touch /tmp/somefile.txt <-- создаем его $ locate /tmp/simefile.txt <-- пытаемся его найти, он не находится $ su <-- тогда логинимся под root, Password: # updatedb -- и обновляем базу locate # exit -- после чего возвращаемся exit $ locate somefile.txt <-- теперь поиск успешен /tmp/somefile.txt $ mv /tmp/somefile.{txt,old} <-- переименовываем $ locate /tmp/somefile.txt <-- под старым именем не находим $ locate /tmp/somefile.old <-- под новым тоже не находим $ su <-- еще раз обновляем базу под root-ом Password: # updatedb # exit $ locate /tmp/somefile.old <-- теперь все OK под новым именем находится /tmp/somefile.old $ locate /tmp/somefile.txt -- под старым нет $

В случае если вы и пользователь или root в одном лице, то проблема решается обновлением базы руками, иначе придется пользоваться чемто более мощным, типа find.

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

Иногда использование locate не эффективно, так был приведен немного исскуственный пример, когда мы находили все файлы в системе, а потом выводили их атрибуты с помощью ls -ld. В данном случае более правильное решение есть использовать тотже find, дело в том что в вышеприведенном случае сканирование системы происходит все равно, только делает это не locate, а ls, добавте сюда накладные расходы на трубопровод, xargs, в результате получаем:

$ cat /tmp/l locate -f proc / | xargs -n 1000 ls -ld

$ cat /tmp/f find / -ls 2>/dev/null

$ time /tmp/f >/dev/null 3.83user 2.80system 0:06.99elapsed 94%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (358major+147minor)pagefaults 0swaps

$ time /tmp/l >/dev/null 5.41user 5.92system 0:11.62elapsed 97%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (28176major+11719minor)pagefaults 0swaps

Как видно в данном случае locate с компанией сел в лужу, выполняя поставленную задачу в два раза медленнее чем find. Конечно пример надуманный, но иллюстрирует тот факт что перед решением любой задачи не мешает пораскинуть мозгами!

На этом разрешите откланяться. До новых встреч.



Содержание раздела