Используйте & ldquo; locate & rdquo; в какой-то конкретной директории?

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

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

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

47
задан 3 April 2011 в 16:53

5 ответов

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

РАСШИРЕНИЕ ОБЪЕКТА ФИЛЬМЫ
Когда вы набираете locate /bin/b* (обратите внимание, что нет кавычек), происходит несколько вещей.

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

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

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

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

Резюме: «расширение shell filname» совершенно отличается от «regex»

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


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

Вы можете использовать возможность регулярных выражений locate, а не просто оболочку ... (locate /dir/myfile* оболочка) ...

Из info locate : -r, --regex

  • «... (регулярное выражение) сопоставления выполняются для всего имени пути, и поэтому по умолчанию a путь будет совпадать, если какая-либо его часть соответствует указанному регулярному выражению. Регулярное выражение может использовать ^ или $ для привязки совпадения в начале или в конце имени пути. "[ 1147]

примечание: -i = игнорировать регистр
. , , , , -r = регулярное выражение
. , , , , ~ / будет расширен оболочкой до / home / user (когда ~ / не в кавычках)
. , , , , '\' (baskslash + пробел; без кавычек) - это буквальный пробел (чтобы избежать расширения оболочки). Вы можете поместить строку в кавычки, но обязательно оставьте ~ / вне кавычек: ~/my\ regex или -/"my regex"

например. locate -ir ~/".*"la\ bella\ vita совпадает с locate -ir ~/".*la bella vita" и будет искать во всем домашнем каталоге «La Bella Vita», встречающееся где угодно.

Вы также можете ограничить поиск только именем файла , но используя -b или --basename .. в этом случае регулярное выражение начала строки ^ применяется к только базовое имя ...

Я чаще всего использую locate -bir

PS .. Locate настолько быстро, что я никогда не использовал find ... и я не использовал наутилус поиск (слишком медленный)

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

0
ответ дан 3 April 2011 в 16:53

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

cd /home/tim/science
locate math | grep `pwd`
0
ответ дан 3 April 2011 в 16:53

Пропустите его через grep, как это

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

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

0
ответ дан 3 April 2011 в 16:53

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

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

0
ответ дан 3 April 2011 в 16:53

Мне нравится использовать locate --all как, возможно, locate -A tim science math. Я думаю, что это в духе простоты locate.

0
ответ дан 21 September 2020 в 11:14

Другие вопросы по тегам:

Похожие вопросы: