在某些特定目录下使用“查找”?


46

我想知道如何将“ locate”的搜索范围限制为某个目录?

例如,如何在某些目录“ / home / tim / science /”下的名称中找到字符串为“ math”的文件/目录?

谢谢并恭祝安康!

Answers:


30

更新:关于使用locate的正则表达式选项与shell的文件名扩展(相对于locate的args)的说明...

外壳文件名扩展
当您键入locate /bin/b*(请注意没有引号)时,会发生几件事。

  1. 首先,shell filename-expansion将扩展特殊的shell模式字符 *(这是因为*是不受保护的,即没有“双引号”)
  2. 产生的扩展名是文件名列表。这可能很长...此列表传递给locate了许多单独的命令行参数。
  3. 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的列表)

  1. -r选项告诉locate将您的arg视为正则表达式模式。
  2. 用引号引起来的*可以防止Shell文件名扩展。这意味着*和点。现在是特殊的正​​则表达式字符
  3. 作为正则表达式,您可以很容易地以各种方式告诉'locate'匹配其数据库条目:eg1。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的数据库...(但是,如果您是新添加的,则可能知道它的位置:)....


13

像这样通过grep传递它

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

编辑:另一个答案更好,我不知道您可以通过一个模式来定位。


@Adam ..不要小看你的方法;没关系,但是您可以使用locate自己的正则表达式而不是管道传递给grep。答案...
Peter.O 2011年

2
定位少| grep ^ / bin的速度比locate -r ^ / bin /.* less更快,因为更少的定位将对单词less进行有效的搜索,而locate -r将对locatedb中的所有条目执行正则表达式操作
Marcel Valdez Orozco

@MarcelValdezOrozco什么是“有效搜索单词”,为什么它比正则表达式快?
Flashrunner

@Flashrunner因为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
Marcel Valdez Orozco,

@MarcelValdezOrozco但是,为什么在db上O(log(n))进行非正则表达式搜索却在正则表达式搜索时O(n)呢?在每种情况下,db中的条目数量都是相同的。我猜这是搜索算法?
Flashrunner '18

8

您可以使用locate /rootpath/*filenamespec。我以前没有尝试过,但是它似乎可以工作。举个例子,locate /home/tim/science/*math*

您可能要查看find命令而不是locate那种行为。语法为find rootforsearch -name filenamepattern -print。在这种情况下,您的示例将需要find /home/tim/science -name *math* -print。不像没有数据库可搜索那样快,它实际上是在搜索文件系统。如果您打算对文件进行实际操作,除了打印以外,还有许多其他选项可以使用。


这是最好的答案,因为它使用了locate自身(不需要任何其他实用程序,例如grep)并且没有正则表达式(这很好,但是在这种情况下是不必要的)。
汤姆(Tom)

此功能的工作原理非常像一种超级
按钮

1

对我来说最方便的是

cd /home/tim/science
locate math | grep `pwd`

你真的读过这个问题吗?
Tessaracter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.