Відповіді:
ОНОВЛЕННЯ : Примітка про використання опції regex пошуку locate проти розширення імені файлу оболонки стосовно аргументів пошуку ...
РОЗШИРЕННЯ ФІЛЕНАМУ
Коли ви вводите locate /bin/b*
(зауважте, немає лапок), трапляється кілька речей.
locate
стільки ж окремим аргументам командного рядка. locate
потім тестує кожен з цих аргументів проти кожного з файлів у його базі даних та видає збіги. Зауважте, що "locate" не має поняття в поточному робочому каталозі. Це відповідає тільки вашим аргументам проти повністю кваліфікованих файлових імен у своїй базі даних.
Це означає, що вона відповідатиме обом, /bin/bash
і /home/user/bin/brackets
ви маєте певний ступінь контролю над цим способом, але пошук пошуку по регулярних виразів пропонує більше; як і деякі інші варіанти пошуку.
ОПЦІЯ РОЗВИТКУ МІСЦЕВОГО ВИПУСКУ
Коли ви вводите locate -r "/bin/b.*"
різні речі, ніж це робити з простими аргами .. ( оболонки з розширеними оболонками - це лише список простих аргів)
-r
Опція вказує місце розташування для лікування вашого ARG як регулярних виразів шаблону. locate -r "^/bin/b.*"
створює імена файлів, починаючи з / bin / b ... eg2. locate -r ~/"bin/b.*"
створює імена файлів, що починаються з / home / user / bin / b .. Зауважте, що ~ / не захищено "лапками" і тому підлягає розширення оболонки, яке перетворює ~ / в / home / user / Короткий зміст: "розширення назви файлів оболонки" зовсім інше, ніж "регулярний вираз"
Тепер поверніться до початкової публікації:
locate
Зазвичай перелічується вся база даних для stdout, тому для обмеження її в певному каталозі вам потрібно відфільтрувати ... Це можна зробити за допомогою параметрів locate.
Ви можете скористатися можливістю вибору геодезичних значень, а не просто обшивки ... ( locate /dir/myfile*
це оболонка) ...
З інформації знайти : -r
,--regex
Примітка: -i = ігнорувати випадок
. . . . . -r = регулярний вираз
. . . . . ~ / буде розширено оболонкою до / home / user (коли ~ / не в лапках)
. . . . . '\' (baskslash + space; немає лапок) - це буквальний простір (щоб уникнути розширення оболонки). Ви можете помістити рядок у лапки, але не забудьте залишити ~ / за межами лапок: ~/my\ regex
або-/"my regex"
напр. locate -ir ~/".*"la\ bella\ vita
- це те саме, що locate -ir ~/".*la bella vita"
і буде шукати у всьому домашньому каталозі "La Bella Vita", що зустрічається в будь-якому місці.
Ви також можете обмежити пошук лише іменем файлу, але, використовуючи -b
або --basename
.., у цьому випадку початок рядка регулярного вираження ^
застосовується лише до базового імені ...
Я найчастіше знаходжу себе в застосуванні locate -bir
PS .. Locate
настільки швидкий, що я ніколи не використовував find
... ні я не використовував пошук nautilus (занадто повільно)
Якщо "знайти", якщо ви шукаєте щось, що додається нещодавно, просто запустіть sudo updatedb
оновити базу даних locate ... (але якщо ви нещодавно додали її, ви, мабуть, знаєте, де це:) ....
Трубопровід через греп, як це
$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless
Редагувати: Інша відповідь краще, я не знав, що ви можете передати шаблон пошуку.
locate
робить O(log(n))
пошук по locatedb
коли ви даєте йому , нерегулярно вираз пошукового запиту, то ви можете використовувати grep
регулярний вираз «s для виконання O(m)
пошуку по вже зниженим підрозділами результатів. (n = загальна кількість записів у locatedb
[тобто всіх файлах вашого диска], m = # записів, які менше відповідають вашим locatedb
), загальна складність:, O(log(n)) + O(m)
де m в середньому log(n)
, тож ви отримуєте 2*O(log(n))
, на відміну від O(n)
виконання запит регулярного вираження для всіх записів у locatedb
.
O(log(n))
пошук під час регулярного вибору O(n)
? Кількість записів у db однакова у кожному випадку. Я думаю, це алгоритм пошуку?
Ви можете використовувати. locate /rootpath/*filenamespec
Я раніше не пробував, але, здається, працює. Щоб зробити ваш приклад, було бlocate /home/tim/science/*math*
Можливо, ви хочете подивитися на find
команду, а не locate
на таку поведінку. Синтаксис був би find rootforsearch -name filenamepattern -print
. У цьому випадку ваш приклад вимагає. find /home/tim/science -name *math* -print
Не так швидко, як знайти, оскільки немає бази даних для пошуку ... він фактично здійснює пошук у файловій системі. Існує безліч варіантів, які можна використовувати, крім друку, якщо ви дійсно хочете щось зробити з файлом.
locate
себе (не вимагаючи жодної іншої утиліти на зразок grep
) і обробляє без регулярних виразів (які є приємними, але непотрібними в цьому випадку).
Для мене найзручніше
cd /home/tim/science
locate math | grep `pwd`