在某个特定目录下使用“locate”?
我想知道如何将“定位”的搜索范围限制在某个目录中?
例如,如何在某些目录“/ home / tim / science /”下的名称中查找字符串“math”的文件/目录?
感谢致敬!
更新 :关于使用locate的正则表达式选项与shell的文件名扩展相关于locate的args的说明…
SHELL FILENAME EXPANSION
当您键入locate /bin/b*
(注意没有引号)时,会发生一些事情。
- 首先, shell文件名扩展将扩展特殊的shell模式charecter *(这是因为*是不受保护的,即没有“双引号”)
- 生成的扩展是文件名列表 。 这可能很长…这个列表被传递以
locate
尽可能多的单独命令行args。 - 然后
locate
针对其数据库中的每个文件测试这些args中的每一个,并输出匹配项。
但请注意,’locate’没有当前工作目录的概念。 它仅将您的args与其数据库中的完全限定文件名匹配。
这意味着它将匹配/bin/bash
和 /home/user/bin/brackets
你有这种程度的控制,但找到的正则表达式搜索提供更多; 和其他一些定位选项一样。
定位’REGEX选项
当你输入locate -r "/bin/b.*"
会发生与简单args不同的事情。( shell-expanded-args只是一个简单的args列表)
-
-r
选项告诉locate将您的arg视为正则表达式模式。 - 引号保护*不受shell文件名扩展的影响。 它意味着*和点。 现在是特殊的正则表达式字符
- 作为正则表达式,您可以非常轻松地告诉’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\ 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 /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`