在某个特定目录下使用“locate”?

我想知道如何将“定位”的搜索范围限制在某个目录中?

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

感谢致敬!

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

SHELL FILENAME EXPANSION
当您键入locate /bin/b* (注意没有引号)时,会发生一些事情。

  1. 首先, shell文件名扩展将扩展特殊的shell模式charecter *(这是因为*是不受保护的,即没有“双引号”)
  2. 生成的扩展是文件名列表 。 这可能很长…这个列表被传递以locate尽可能多的单独命令行args。
  3. 然后locate针对其数据库中的每个文件测试这些args中的每一个,并输出匹配项。

但请注意,’locate’没有当前工作目录的概念。 它仅将您的args与其数据库中的完全限定文件名匹配。
这意味着它将匹配/bin/bash /home/user/bin/brackets
你有这种程度的控制,但找到的正则表达式搜索提供更多; 和其他一些定位选项一样。

定位’REGEX选项
当你输入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 / bin / b开头的文件名。注意〜/不受“引号”的保护,因此需要进行shell波浪扩展将〜/转换为/ home / user /

总结:“shell filname扩展”与’正则表达式’完全不同

现在回到原帖:


locate通常会将整个数据库列为stdout,因此要将其限制为您需要对其进行过滤的特定目录…您可以通过locate的选项来执行此操作。

您可以使用locate的正则表达式function,而不仅仅是shell-globbing …( locate /dir/myfile*是shell-globbing)…

信息中找到-r , – --regex

  • “…(regex)匹配是针对整个路径名执行的,因此默认情况下,如果路径名的任何部分与指定的正则表达式匹配,则匹配路径名。正则表达式可以使用^$来锚定匹配路径名的开头或结尾。“

注意:-i =忽略大小写
。 。 。 。 。 -r =正则表达式
。 。 。 。 。 〜/将由shell扩展到/ home / user(当〜/不在引号中时)
。 。 。 。 。 ‘\’ (baskslash + space;无引号)是一个文字空间(以避免shell扩展)。 你可以把字符串放在引号中,但一定要留下引号外的~/my\ regex~/my\ regex-/"my regex"

例如。 locate -ir ~/".*"la\ bella\ vitalocate -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 /rootpath/*filenamespec 。我之前没有尝试过,但它似乎有效。 举个例子,它将是locate /home/tim/science/*math*

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

对我来说最方便的是

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