Ответы:
ОБНОВЛЕНИЕ : примечание об использовании параметра регулярного выражения 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))locatedbgrepO(m)locatedblocatedbO(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`