Використовувати "locate" в якомусь конкретному каталозі?


46

Мені було цікаво, як обмежити діапазон пошуку "знайти" в якійсь директорії?

Наприклад, як знайти файли / каталоги з рядком "math" у своїх іменах під деяким каталогом "/ home / tim / science /"?

Дякую та з повагою!

Відповіді:


30

ОНОВЛЕННЯ : Примітка про використання опції regex пошуку locate проти розширення імені файлу оболонки стосовно аргументів пошуку ...

РОЗШИРЕННЯ ФІЛЕНАМУ
Коли ви вводите locate /bin/b*(зауважте, немає лапок), трапляється кілька речей.

  1. По-перше, розширення імені файлу оболонки розширить спеціальний показник шаблону оболонки * (Це тому, що * незахищений, тобто немає "подвійних лапок")
  2. Отримане розширення - це список імен файлів . що, можливо, дуже довгий ... Цей список передається locateстільки ж окремим аргументам командного рядка.
  3. locate потім тестує кожен з цих аргументів проти кожного з файлів у його базі даних та видає збіги.

Зауважте, що "locate" не має поняття в поточному робочому каталозі. Це відповідає тільки вашим аргументам проти повністю кваліфікованих файлових імен у своїй базі даних.
Це означає, що вона відповідатиме обом, /bin/bash і /home/user/bin/brackets
ви маєте певний ступінь контролю над цим способом, але пошук пошуку по регулярних виразів пропонує більше; як і деякі інші варіанти пошуку.

ОПЦІЯ РОЗВИТКУ МІСЦЕВОГО ВИПУСКУ
Коли ви вводите locate -r "/bin/b.*"різні речі, ніж це робити з простими аргами .. ( оболонки з розширеними оболонками - це лише список простих аргів)

  1. -rОпція вказує місце розташування для лікування вашого ARG як регулярних виразів шаблону.
  2. Лапки захищають * від розширення імені файлу оболонки. Це означає, що * і крапка. тепер спеціальні символи регулярного виразів
  3. Будучи регулярним виразом, ви можете легко сказати "знайти", щоб відповідати його запису в базу даних різними способами: eg1. 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

  • "... (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 ... (але якщо ви нещодавно додали її, ви, мабуть, знаєте, де це:) ....


13

Трубопровід через греп, як це

$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless

Редагувати: Інша відповідь краще, я не знав, що ви можете передати шаблон пошуку.


@Adam .. Не варто недооцінювати свій метод; це цілком нормально, але ви можете використовувати власний регекс locate замість того, щоб переводити на grep .. "Інший" метод, на який ви посилаєтесь, не використовує регулярний вираз і поводиться зовсім інакше .... Я додав детальну інформацію про відмінності до мого відповідь ...
Пітер.О

2
знайти менше | grep ^ / bin набагато швидше, ніж locate -r ^ / bin /.* менше, тому що locate менше буде виконувати ефективний пошук слова менше, а locate -r виконає операцію регулярного вираження всіх записів у locb
Марсель Вальдес Ороско

@MarcelValdezOrozco Що таке "ефективний пошук слова" і чому це швидше ніж регулярний вираз?
Flashrunner

@Flashrunner Тому що 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.
Марсель Вальдес Ороско,

@MarcelValdezOrozco Але чому пошук негенеральних значень через db - це O(log(n))пошук під час регулярного вибору O(n)? Кількість записів у db однакова у кожному випадку. Я думаю, це алгоритм пошуку?
Flashrunner

8

Ви можете використовувати. locate /rootpath/*filenamespecЯ раніше не пробував, але, здається, працює. Щоб зробити ваш приклад, було бlocate /home/tim/science/*math*

Можливо, ви хочете подивитися на findкоманду, а не locateна таку поведінку. Синтаксис був би find rootforsearch -name filenamepattern -print. У цьому випадку ваш приклад вимагає. find /home/tim/science -name *math* -printНе так швидко, як знайти, оскільки немає бази даних для пошуку ... він фактично здійснює пошук у файловій системі. Існує безліч варіантів, які можна використовувати, крім друку, якщо ви дійсно хочете щось зробити з файлом.


Це найкраща відповідь, оскільки вона використовує locateсебе (не вимагаючи жодної іншої утиліти на зразок grep) і обробляє без регулярних виразів (які є приємними, але непотрібними в цьому випадку).
Том

Це справді схоже на шарм, який ви можете використовувати locate для пошуку файлів у конкретному каталозі Path, дякую @Nerdfest
amit_game

1

Для мене найзручніше

cd /home/tim/science
locate math | grep `pwd`

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