знайти проти знайти


30

Є команди findі locateдля пошуку файлів на диску.

Я знаю, що findрекурсивно обробляє всі необхідні підкаталоги для пошуку файлів і тому є повільним, але locateоновленим , тоді як використовує базу даних, яка оновлюється раз у раз (коли саме?), Щоб швидко показати результати, які, можливо, застаріли.

Чи є інші відмінності? У яких ситуаціях ви б віддавали перевагу тому чи іншому? І коли locateбаза даних зазвичай оновлюється?



1
manpages.ubuntu.com/manpages/trusty/man8/updateb.8.html "updatedb зазвичай виконується щодня cron (8) для оновлення бази даних за замовчуванням."
Rinzwind

@Rinzwind Пов'язана відповідь на U&L є приголомшливою, шкода, що ми не можемо робити дублікати між сайтами. Але чи знаєте ви більше про cronjob, коли саме він запуститься? Після запуску? У певний час (я думаю, я читав 1-2 ранку чи щось подібне) лише? Що станеться, якщо в цей час його закрити? Чи запускається він, коли комп'ютер у режимі очікування? Як я можу побачити вік бази даних?
Байт-командир

2
@ByteCommander - Це те anacron, для чого. Я не знаю, чи встановлено це за замовчуванням на настільних системах / серверах, але це на ноутбуках. Він працює під час завантаження і бачить, чи повинні працювати якісь завдання cron, поки система була вимкнена та виконує їх. Це дійсно корисно, але може викликати деякі проблеми, якщо у вас заплановані роботи далеко від півночі. Це може спричинити запуск роботи під час завантаження, а потім знову, коли з’явиться час - можливо набагато менше ніж через 24 години (для щоденної роботи.)
Джо,

@Joe Тож він буде працювати під час завантаження і сповільнюватиме його, або він буде працювати деякий час після завантаження, або він зазвичай працює з таким низьким пріоритетом, що він працює лише тоді, коли система майже не працює?
Байт-командир

Відповіді:


27

locateнасправді корисний лише для пошуку файлів та їх відображення людям. Ви можете зробити декілька речей з цим, але я б не довіряв цьому досить сильно розібратися, і, як ви кажете, - неможливо гарантувати стан внутрішньої бази даних, тим більше, що запускається лише /etc/cron.daily/mlocateодин раз на день!

findживе. Він фільтрує, виключає, виконує. Він підходить для розбору. Він може виводити відносні шляхи. Він може виводити повні шляхи. Він може робити речі на основі атрибутів, а не лише імен.

locateзвичайно, в моєму наборі інструментів є місце, але, як правило, внизу, як зусилля останнього канаву, щоб знайти щось. Це легше, ніж findтеж.


2
Я знаходжусь locateнабагато швидше, якщо хочу шукати всю свою файлову систему. І ви можете вручну оновити базу даних, використовуючи її updatedbперед її використанням.
hytromo

Ви знаєте, як саме налаштовано цей cronjob? Він працює в певний час або коли система працює в режимі очікування або через n хвилин після запуску? Тому що я думаю, що я десь прочитав, що це заплановано о 1-2 ранку, коли моя машина зазвичай вимикається. Він ніколи не оновлюватиметься, окрім вручну ( sudo updatedb)? І чи є шанс побачити, скільки років базі даних?
Байт-командир

grep run-parts /etc/crontabВи побачите, що ними керують anacron( через які ви переконаєтесь man anacron, більш стійкі до систем, які не працюють постійно). З того, що я бачу, він повинен запустити його під час завантаження, якщо ви пропустите початковий час крона.
Олі

2
Я вважаю, що locate не індексує мої знімні / відключені розділи, тому, якщо я хочу щось знайти на них, мені доведеться використовувати find. Звичайно, у locate немає всіх дивовижних варіантів, які знаходять - як -exec command {} \;запустити команду на кожному знайденому файлі. Мені подобається використовувати locate -bобмеження для пошуку файлів, які відповідають кінцевому компоненту імені - без решти шляху. Я часто намагаюся це спершу, бо це так швидко. Крім того, ви можете запустити sudo updatedbбудь-який час, коли потрібно оновити базу даних пошуку.
Джо

якщо вам потрібен пошук у реальному часі, який також є дещо легким, ви можете скористатися чимось на зразокls -R | grep 'file_name.txt'
jena

8

Наскільки мені подобається Олі (що багато!), Я не погоджуюся з ним за 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 всіх файлів для рядка займає багато часу

Я знаю, що можу зіткнутися з параметрами команди 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команда, яка оновлює базу даних локалізації , запускається лише один раз на день за замовчуванням. Ви можете запустити його вручну перед тим, як шукати файли, щойно додані, використовуючи:

$ 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команди є своя база даних, яка дає їй блискавичну швидкість порівняно.


@EliahKagan Але команда find прокручувала та перераховувала всі каталоги та файли на всіх дисках розділів. Схоже, це працювало, і я очікував роздрукування наприкінці ... Так чи інакше, справа не в тому, щоб "виправити" пошук команди пошуку, а про те, щоб отримати час. Запуск locate / display-auto-brightnessзаймає 17 секунд, а також відображає всі каталоги та файли на всіх дисках.
WinEunuuchs2Unix

@EliahKagan Я розумію. --regexбуло необхідно, тому що в моєму рядку пошуку було повернуто забагато результатів. Я знайду два нові приклади пошуку та пошуку та оновлення своєї відповіді за кілька хвилин.
WinEunuuchs2Unix

1
Щоб уточнити точку Еліа, ця findкоманда означає "надрукувати назви файлів усіх файлів у каталогах /і display-auto-brightness." Я думаю, ти мав намір скористатися find / -name display-auto-brightness, але навіть це видає багато непотрібних помилок "Дозволено відмовлено".
wjandrea

@wjandrea Так, як я вже говорив, справа не в тому, щоб знайти файл, це був час на пошук команди. Тепер я повторюю тести з допустимими параметрами після промивання кеш-пам'яті. Тоді я оновлю відповідь.
WinEunuuchs2Unix

1
@Win Ні, ваш приклад все ще дійсний, і я не думаю, що час обробки сильно змінився, знайдений файл чи ні.
wjandrea
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.