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

35

Мне было интересно, как ограничить диапазон поиска «найти» в какой-то каталог?

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

Спасибо и приветствую!

    
задан Tim 03.04.2011 в 12:53
источник

3 ответа

17

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

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

  1. Во-первых, shell filename-expand расширяет специальный shell pattern charecter * (это потому, что * не защищен, т. е. нет «двойных кавычек», )
  2. Результатом этого расширения является список имен файлов . который, возможно, очень длинный ... Этот список передается locate по количеству отдельных команд командной строки.
  3. locate затем проверяет каждый из этих аргументов на каждый из файлов в своей базе данных и выводит совпадения.

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

ВАРИАНТ REGEX LOCATE
Когда вы набираете locate -r "/bin/b.*" , происходят разные вещи, чем с простыми args .. ( shell-expand-args - это просто список простых аргументов)

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

Сводка: «расширение файлового имени оболочки» отличается от «regex»

Вернемся к исходному сообщению:

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

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

Из info locate : -r , --regex

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

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

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

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

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

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

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

    
ответ дан Peter.O 03.04.2011 в 15:48
источник
12

Протяните его через grep, вот так

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

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

    
ответ дан Adam Byrtek 03.04.2011 в 14:42
7

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

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

    
ответ дан Nerdfest 03.04.2011 в 13:03