Ответы:
ОБНОВЛЕНИЕ : примечание об использовании параметра регулярного выражения locate против расширения имени файла оболочки относительно аргументов locate ...
SHELL FILENAME EXPANSION
Когда вы печатаете locate /bin/b*
(обратите внимание, что нет кавычек), происходит несколько вещей.
locate
как можно большему количеству отдельных аргументов командной строки. locate
затем проверяет каждое из этих аргументов на соответствие каждому из файлов в своей базе данных и выводит совпадения. Обратите внимание, однако, что «locate» не имеет понятия о текущем рабочем каталоге. Он сопоставляет ваши аргументы только с полностью определенными именами файлов в его базе данных.
Это означает, что он будет соответствовать обоим, /bin/bash
и у /home/user/bin/brackets
вас есть некоторая степень контроля таким образом, но поиск по регулярным выражениям locate предлагает больше; как и некоторые другие варианты локации.
ОПЦИЯ LOCATE'S REGEX
Когда вы печатаетеlocate -r "/bin/b.*"
разные вещи, чем с простыми аргументами .. ( shell-extended-args - это просто список простых аргументов)
-r
Опция указывает местоположение для лечения вашего ARG как регулярных выражений шаблона. 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 ... (но если вы недавно добавили это, вы, вероятно, знаете, где это находится:) ....
Труба через grep, вот так
$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless
Изменить: другой ответ лучше, я не знал, что вы можете передать шаблон для поиска.
locate
выполняется, когда вы даете ему поисковый запрос без регулярных выражений, вы можете использовать регулярные выражения для выполнения поиска по уже сокращенным подрежимам. (n = общее количество записей в [то есть во всех файлах вашего диска], m = количество записей, которые меньше соответствуют вашим ), общая сложность бега: где m в среднем , так что вы получите , а не когда вы выполняете запрос регулярного выражения для всех записей в . O(log(n))
locatedb
grep
O(m)
locatedb
locatedb
O(log(n)) + O(m)
log(n)
2*O(log(n))
O(n)
locatedb
O(log(n))
а поиск по регулярным выражениям O(n)
? Количество записей в дб одинаково в каждом случае. Я думаю, это алгоритм поиска?
Вы можете использовать. 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`