Использовать «найти» в каком-то определенном каталоге?

46

Мне было интересно, как ограничить диапазон поиска "locate" для какого-либо каталога?

Например, как найти файлы / каталоги со строкой "math" в их именах в некотором каталоге "/ home / tim / science /"?

Спасибо и всего наилучшего!

Тим
источник

Ответы:

30

ОБНОВЛЕНИЕ : примечание об использовании параметра регулярного выражения locate против расширения имени файла оболочки относительно аргументов locate ...

SHELL FILENAME EXPANSION
Когда вы печатаете locate /bin/b*(обратите внимание, что нет кавычек), происходит несколько вещей.

  1. Во-первых, расширение имени файла оболочки расширит специальный шаблон оболочки * (Это потому, что * не защищен, т. Е. Нет двойных кавычек).
  2. Это результирующее расширение представляет собой список имен файлов . что, возможно, очень долго ... Этот список передается locateкак можно большему количеству отдельных аргументов командной строки.
  3. locate затем проверяет каждое из этих аргументов на соответствие каждому из файлов в своей базе данных и выводит совпадения.

Обратите внимание, однако, что «locate» не имеет понятия о текущем рабочем каталоге. Он сопоставляет ваши аргументы только с полностью определенными именами файлов в его базе данных.
Это означает, что он будет соответствовать обоим, /bin/bash и у /home/user/bin/brackets
вас есть некоторая степень контроля таким образом, но поиск по регулярным выражениям locate предлагает больше; как и некоторые другие варианты локации.

ОПЦИЯ LOCATE'S REGEX
Когда вы печатаетеlocate -r "/bin/b.*" разные вещи, чем с простыми аргументами .. ( shell-extended-args - это просто список простых аргументов)

  1. -rОпция указывает местоположение для лечения вашего ARG как регулярных выражений шаблона.
  2. Кавычки защищают * от расширения имени файла оболочки. Это означает, что * и точка. теперь специальные символы регулярных выражений
  3. Будучи регулярным выражением, вы можете очень легко указать 'locate', чтобы соответствовать его записи в базе данных различными способами: например, 1. locate -r "^/bin/b.*"производит имена файлов, начинающиеся с / bin / b ... eg2. locate -r ~/"bin/b.*"производит имена файлов, начинающиеся с / home / user / bin / b . Обратите внимание, что ~ / не защищен "кавычками" и поэтому подвергается расширению оболочки тильды, которое преобразует ~ / в / home / user /

Резюме: "расширение имени файла-оболочки" сильно отличается от "регулярного выражения"

Теперь вернемся к исходному сообщению:


locate обычно выводит всю базу данных на стандартный вывод, поэтому, чтобы ограничить ее определенным каталогом, необходимо отфильтровать его ... Это можно сделать с помощью опций locate.

Вы можете использовать возможность регулярного выражения 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 (слишком медленно)

С помощью 'locate', если вы ищете что-то новое, просто запустите, sudo updatedbчтобы обновить базу данных locate ... (но если вы недавно добавили это, вы, вероятно, знаете, где это находится:) ....

Peter.O
источник
13

Труба через grep, вот так

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

Изменить: другой ответ лучше, я не знал, что вы можете передать шаблон для поиска.

Адам Быртек
источник
@ Адам .. Не стоит недооценивать свой метод; это вполне нормально, но вы можете использовать собственное регулярное выражение locate вместо piping для grep. "Другой" метод, на который вы ссылаетесь, не использует регулярное выражение и ведет себя совсем по-другому .... Я добавил некоторые подробности о различиях в моем ответ ...
Peter.O
2
найти меньше | grep ^ / bin намного быстрее, чем locate -r ^ / bin /.* less, потому что locate less выполнит эффективный поиск по слову less, а locate -r выполнит операцию регулярного выражения над всеми записями в расположенном b
Marcel Valdez Orozco
@MarcelValdezOrozco Что такое «эффективный поиск по слову» и почему он быстрее, чем регулярное выражение?
Flashrunner
@Flashrunner Поскольку поиск locateвыполняется, когда вы даете ему поисковый запрос без регулярных выражений, вы можете использовать регулярные выражения для выполнения поиска по уже сокращенным подрежимам. (n = общее количество записей в [то есть во всех файлах вашего диска], m = количество записей, которые меньше соответствуют вашим ), общая сложность бега: где m в среднем , так что вы получите , а не когда вы выполняете запрос регулярного выражения для всех записей в . O(log(n))locatedbgrepO(m)locatedblocatedbO(log(n)) + O(m)log(n)2*O(log(n))O(n)locatedb
Марсель Вальдес Орозко
@MarcelValdezOrozco Но почему поиск без регулярных выражений по БД, O(log(n))а поиск по регулярным выражениям O(n)? Количество записей в дб одинаково в каждом случае. Я думаю, это алгоритм поиска?
Flashrunner
8

Вы можете использовать. locate /rootpath/*filenamespecЯ не пробовал раньше, но, похоже, работает. Чтобы сделать ваш пример, это было быlocate /home/tim/science/*math*

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

Nerdfest
источник
Это лучший ответ, так как он использует locateсам себя (не требуя никакой другой утилиты, такой как grep) и обходится без регулярных выражений (что приятно, но в этом случае не нужно).
Том
Этот действительно работает как талисман, который вы можете использовать locate для поиска файлов в определенном пути к каталогу, спасибо @Nerdfest
amit_game
1

Для меня наиболее удобным является

cd /home/tim/science
locate math | grep `pwd`
alex440
источник
Вы действительно прочитали вопрос?
Tessaracter