Как бы мне ни нравился Оли (а это очень много!), Я не согласен с ним в 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
команды есть своя собственная база данных, которая дает молниеносную скорость сравнения.