Answers:
更新:关于使用locate的正则表达式选项与shell的文件名扩展(相对于locate的args)的说明...
外壳文件名扩展
当您键入locate /bin/b*
(请注意没有引号)时,会发生几件事。
locate
了许多单独的命令行参数。 locate
然后针对其数据库中的每个文件测试每个arg,并输出匹配项。 但是请注意,“ locate”没有当前工作目录的概念。它仅将您的args与数据库中的标准文件名匹配。
这意味着它将同时匹配两者,/bin/bash
并且 /home/user/bin/brackets
您以这种方式具有一定程度的控制权,但是locate的正则表达式搜索提供更多功能;与locate的其他选项一样。
LOCATE'S REGEX OPTION
当您键入的locate -r "/bin/b.*"
内容与使用简单args时发生的事情不同。.(shell-expanded-args 只是简单args的列表)
-r
选项告诉locate将您的arg视为正则表达式模式。 locate -r "^/bin/b.*"
产生以/ bin / b ... eg2 开头的文件名。locate -r ~/"bin/b.*"
产生开头的文件名/ home / user中/斌/ B ..请注意,在〜/是不是由“引用的标志”保护,因此受外壳波浪线扩展它转换〜/到/ home / user中/ 摘要:“ shell filname扩展”与“ regex”完全不同
现在回到原始帖子:
locate
通常会列出要stdout的整个数据库,因此要将其限制为特定目录,您需要对其进行过滤...可以通过locate的选项进行此操作。
您可以使用locate的正则表达式功能,而不仅仅是使用shell-globbing ...(locate /dir/myfile*
is shell-globbing)...
从信息中找到:-r
,--regex
注意:-i =忽略大小写
。。。。。-r =正则表达式
。。。。。外壳将〜/扩展到/ home / user(当〜/不在引号中时)
。。。。。'\'(baskslash + space;不带引号)是一个文字空间(以避免shell扩展)。您可以将字符串放在引号中,但请务必将〜/放在引号之外:~/my\ regex
或-/"my regex"
例如。locate -ir ~/".*"la\ bella\ vita
是一样的locate -ir ~/".*la bella vita"
,而且会搜索你的整个主目录为“美丽的公主生活”中任何地方出现。
您还可以将搜索限制为仅文件名,但是使用-b
或--basename
..在这种情况下,正则表达式的行首^
仅适用于基本名称...
我最常发现自己使用 locate -bir
PS .. Locate
是如此之快,以至于我从未使用过find
...也从未使用过鹦鹉螺搜索(太慢了)
使用'locate',如果您正在寻找新添加的内容,只需运行sudo updatedb
以刷新locate的数据库...(但是,如果您是新添加的,则可能知道它的位置:)....
像这样通过grep传递它
$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless
编辑:另一个答案更好,我不知道您可以通过一个模式来定位。
locate
做一个O(log(n))
在搜索locatedb
的时候你给它一个非正则表达式搜索查询,那么你可以使用grep
的正则表达式来执行O(m)
在已经缩小分结果的搜索。(n = locatedb
[即所有驱动器文件中的条目locatedb
总数,m =与您的匹配项较少匹配的条目数] ),总运行复杂度:O(log(n)) + O(m)
,其中m为平均log(n)
,因此得到2*O(log(n))
,而不是O(n)
执行时对中所有条目的正则表达式查询locatedb
。
O(log(n))
进行非正则表达式搜索却在正则表达式搜索时O(n)
呢?在每种情况下,db中的条目数量都是相同的。我猜这是搜索算法?
您可以使用locate /rootpath/*filenamespec
。我以前没有尝试过,但是它似乎可以工作。举个例子,locate /home/tim/science/*math*
您可能要查看find
命令而不是locate
那种行为。语法为find rootforsearch -name filenamepattern -print
。在这种情况下,您的示例将需要find /home/tim/science -name *math* -print
。不像没有数据库可搜索那样快,它实际上是在搜索文件系统。如果您打算对文件进行实际操作,除了打印以外,还有许多其他选项可以使用。
locate
自身(不需要任何其他实用程序,例如grep
)并且没有正则表达式(这很好,但是在这种情况下是不必要的)。