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)并且没有正则表达式(这很好,但是在这种情况下是不必要的)。