Существуют команды find
и locate
для поиска файлов на диске.
Я знаю, что find
рекурсивно обрабатывает все необходимые подкаталоги для поиска файлов и поэтому работает медленно, но актуально, тогда как locate
использует базу данных, которая обновляется время от времени (когда именно?), Чтобы быстро показать результаты, которые могут быть устаревшими, хотя.
Есть ли другие различия? В каких ситуациях один предпочитает один или другой? И когда база данных locate
обновляется обычно?
locate
действительно только хорошо для нахождения файлов и отображения их людям. Можно сделать несколько вещей с ним, но я не доверял бы ему достаточно для парсинга и — как Вы say—, невозможно гарантировать состояние внутренней базы данных, больше потому что только планируется работать от /etc/cron.daily/mlocate
один раз в день!
find
живо. Это фильтрует, исключает, выполняется. Это подходит для парсинга. Это может произвести относительные пути. Это может произвести полные пути. Это может сделать вещи на основе атрибутов, не просто называет.
locate
, конечно, имеет место на моей панели инструментов, но это обычно правильно внизу как последняя попытка найти что-то. Это легче, чем find
также.
Так, как мне нравится Oli (который является много!) Я не соглашаюсь с ним на 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'ing все файлы для строки занимает много времени
Я знаю, что могу играть с параметрами команды находки, чтобы заставить его работать лучше, но точка здесь является количеством времени, которое это занимает для выполнения.
locate
команда берет меньше, чем секундаТеперь давайте использовать locate
:
$ time locate mail-transport-agent.target
/lib/systemd/system/mail-transport-agent.target
real 0m0.816s
user 0m0.792s
sys 0m0.024s
Определять местоположение команда берет меньше, чем секунда!
updatedb
только выполненный один раз в день по умолчаниюЭто верно updatedb
команда, которая обновляет определять местоположение базу данных, только выполняется один раз в день по умолчанию. Можно выполнить его вручную перед поиском файлов, просто добавленных при помощи:
$ 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
команда имеет свою собственную базу данных, которая дает ей скорость молнии в сравнении.