Найти против найти
Есть команды find
а также locate
искать файлы на диске.
я знаю это find
рекурсивно обрабатывает все необходимые подкаталоги для поиска файлов и поэтому работает медленно, но актуально, тогда как locate
использует базу данных, которая время от времени обновляется (когда именно?), чтобы быстро показывать результаты, которые могут быть устаревшими.
Есть ли другие отличия? В каких ситуациях один предпочитает один или другой? И когда locate
база данных обновляется обычно?
2 ответа
locate
действительно хорош только для поиска файлов и их отображения людям. Вы можете сделать с ним несколько вещей, но я бы не стал доверять этому достаточно, чтобы разобрать, и, как вы говорите, невозможно гарантировать состояние внутренней базы данных, тем более что она запускается только из /etc/cron.daily/mlocate
, один раз в день!
find
это живой. Он фильтрует, исключает, выполняет. Подходит для разбора. Может выводить относительные пути. Может выводить полные пути. Он может делать вещи на основе атрибутов, а не только имен.
locate
конечно, есть место в моем наборе инструментов, но обычно оно находится прямо внизу, как последняя попытка найти что-то. Это проще чем find
тоже.
Как бы мне не нравился Оли (а это очень много!), Я не согласен с ним на find
команда. Мне это не нравится
find
Команда занимает более трех минут
Возьмем для примера эту простую команду:
$ time find / -type f -name "mail-transport-agent.target"
find: ‘/lost+found’: Permission denied
find: ‘/etc/ssmtp’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
(... SNIP ...)
find: ‘/run/user/997’: Permission denied
find: ‘/run/sudo’: Permission denied
find: ‘/run/systemd/inaccessible’: Permission denied
real 3m40.589s
user 0m4.156s
sys 0m8.874s
Это займет более трех минут find
искать все, начиная с /
, По умолчанию появляется множество сообщений об ошибках, и вы должны искать их, чтобы найти то, что вы ищете. Еще лучше чем grep
поиск строки по всему диску занимает 53 часа: `grep` для поиска всех файлов строки занимает много времени
Я знаю, что могу поиграться с параметрами команды find, чтобы она работала лучше, но суть здесь в том, сколько времени требуется для запуска.
locate
команда занимает меньше секунды
Теперь давайте использовать locate
:
$ time locate mail-transport-agent.target
/lib/systemd/system/mail-transport-agent.target
real 0m0.816s
user 0m0.792s
sys 0m0.024s
Команда locate занимает меньше секунды!
updatedb
по умолчанию запускается только один раз в день
Это правда updatedb
Команда, которая обновляет базу данных locate, по умолчанию выполняется только один раз в день. Вы можете запустить его вручную, прежде чем искать только что добавленные файлы, используя:
$ time sudo updatedb
real 0m3.460s
user 0m0.503s
sys 0m1.167s
Хотя это займет 3 секунды, это мало по сравнению с find
Команды 3+ минуты.
Я обновил свой sudo crontab -e
включить строку внизу:
# m h dom mon dow command
0 0 1 * * /bin/journalctl --vacuum-size=200M
*/5 * * * * /usr/bin/updatedb
Теперь каждые пять минут updatedb
запускается и locate
База данных команд почти всегда актуальна.
Но нет никаких атрибутов?
Вы можете трубу locate
вывод на другие команды. Например, если вам нужны атрибуты файла, вы можете использовать:
$ locate mail-transport-agent.target | xargs stat
File: '/lib/systemd/system/mail-transport-agent.target'
Size: 473 Blocks: 8 IO Block: 4096 regular file
Device: 10305h/66309d Inode: 667460 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-03-31 18:11:55.091173104 -0600
Modify: 2017-10-27 04:11:45.000000000 -0600
Change: 2017-10-28 07:18:24.860065653 -0600
Birth: -
Резюме
Я разместил этот ответ, чтобы показать скорость и простоту использования locate
, Я пытался устранить некоторые недостатки команды, на которые указывали другие.
find
Команда должна пройти всю структуру каталогов, чтобы найти файлы. locate
У команды есть своя собственная база данных, которая дает молниеносную скорость сравнения.