Есть команды find
и locate
для поиска файлов на диске.
Я знаю, что find
рекурсивно обрабатывает все необходимые подкаталоги для поиска файлов и поэтому работает медленно, но актуально, в то время как locate
использует базу данных, которая обновляется время от времени (когда именно?), Чтобы быстро показывать результаты, которые могут быть устаревшими.
Есть ли другие отличия? В каких ситуациях один предпочел бы тот или другой? И когда locate
база данных обновляется обычно?
anacron
. Я не знаю, установлен ли он по умолчанию на настольных системах / серверах, но на ноутбуках. Он запускается при загрузке и проверяет, должны ли какие-либо задания cron выполняться, пока система выключена, и запускает их. Это действительно полезно, но может вызвать некоторые проблемы, если у вас есть задания, запланированные далеко от полуночи. Это может привести к тому, что задание будет запущено при загрузке, а затем снова, когда придет время - возможно, намного меньше, чем через 24 часа (для ежедневной работы.)Ответы:
locate
действительно хорош только для поиска файлов и их отображения людям. Вы можете сделать с ним несколько вещей, но я бы не стал доверять этому достаточно, чтобы разобрать, и, как вы говорите, невозможно гарантировать состояние внутренней базы данных, тем более что она запускается/etc/cron.daily/mlocate
только один раз в день!find
это живой. Он фильтрует, исключает, выполняет. Подходит для разбора. Может выводить относительные пути. Может выводить полные пути. Он может делать вещи на основе атрибутов, а не только имен.locate
конечно, есть место в моем наборе инструментов, но обычно оно находится прямо внизу, как последняя попытка найти что-то. Это проще чемfind
тоже.источник
locate
что гораздо быстрее, если я хочу искать всю мою файловую систему. И вы можете вручную обновить базу данных, используяupdatedb
перед использованием.sudo updatedb
)? И есть ли шанс увидеть сколько лет базе данных?grep run-parts /etc/crontab
Вы увидите, что они управляются черезanacron
(что, как вы увидитеman anacron
, более устойчиво к системам, которые не работают постоянно). Из того, что я вижу, он должен запускаться при загрузке, если вы пропустите исходное время cron.-exec command {} \;
команда - например, запускать команду для каждого найденного файла. Мне действительно нравится использовать,locate -b
который ограничивает поиск, чтобы найти файлы, которые соответствуют конечному компоненту имени - без остальной части пути. Я часто пробую это сначала, потому что это так быстро. Кроме того, вы можете запустить вsudo updatedb
любое время, чтобы обновить базу данных locate.ls -R | grep 'file_name.txt'
Как бы мне ни нравился Оли (а это очень много!), Я не согласен с ним в
find
команде. Мне это не нравитсяfind
Команда занимает более трех минутВозьмем для примера эту простую команду:
Он занимает более трех минут для
find
поиска все , начиная с/
. По умолчанию появляется множество сообщений об ошибках, и вы должны искать их, чтобы найти то, что вы ищете. Тем не менее, это лучше, чемgrep
искать строку на всем диске, что занимает 53 часа : `grep` для всех файлов на строку занимает много времениЯ знаю, что могу поиграться с параметрами команды find, чтобы она работала лучше, но суть здесь в том, сколько времени требуется для запуска.
locate
команда занимает меньше секундыТеперь давайте использовать
locate
:Команда locate занимает меньше секунды!
updatedb
по умолчанию запускается только один раз в деньЭто правда, что
updatedb
команда, которая обновляет базу данных locate, по умолчанию выполняется только один раз в день. Вы можете запустить его вручную, прежде чем искать только что добавленные файлы, используя:Хотя это займет 3 секунды, это мало по сравнению с
find
3 + минутами команды.Я обновил мой,
sudo crontab -e
чтобы включить строку внизу:Теперь
updatedb
запускаются каждые пять минут, аlocate
база данных команд почти всегда обновляется.Но нет никаких атрибутов?
Вы можете передать
locate
вывод другим командам. Например, если вам нужны атрибуты файла, вы можете использовать:Резюме
Я разместил этот ответ, чтобы показать скорость и простоту использования
locate
. Я пытался устранить некоторые недостатки команды, на которые указывали другие.Команда
find
должна обойти всю структуру каталогов, чтобы найти файлы. Уlocate
команды есть своя собственная база данных, которая дает молниеносную скорость сравнения.источник
locate / display-auto-brightness
занимает 17 секунд, а также отображает каждый каталог и файл на всех дисках.--regex
было необходимо, потому что с моей строкой поиска было возвращено слишком много результатов. Я найду два новых примера для поиска, найду и обновлю свой ответ через несколько минут.find
команда означает «напечатать имена файлов всех файлов в каталогах/
иdisplay-auto-brightness
». Я думаю, что вы хотели использоватьfind / -name display-auto-brightness
, но даже это печатает много ненужных ошибок «Отказано в доступе».