问题描述
我想知道如何将”locate”的搜索范围限制在某个目录中?
例如,如何在某个目录”/home/tim/science/”下找到名称中包含字符串”math”的文件/目录?
感谢致敬!
最佳解决办法
更新:关于使用locate的正则表达式选项与shell的filename expansion关于locate的args的注释…
SHELL FILENAME EXPANSION当您键入locate /bin/b*
(注意没有引号)时,会发生一些事情。
-
首先,shell filename-expansion将扩展特殊的shell模式charecter *(这是因为*是不受保护的,即没有”double-quotes”)
-
生成的扩展是文件名列表。这可能很长…这个列表被传递给
locate
作为许多单独的命令行args。 -
然后,
locate
针对其数据库中的每个文件测试每个args,并输出匹配项。
但请注意,’locate’没有当前工作目录的概念。它只会将您的args与其数据库中的fully-qualified file-names匹配。这意味着它将匹配/bin/bash
和/home/user/bin/brackets
您可以通过这种方式进行某种程度的控制,但是找到的正则表达式搜索提供更多;和其他一些定位选项一样。
LOCATE”REGEX选项当你键入locate -r "/bin/b.*"
时,会发生与简单args不同的事情。(shell-expanded-args只是一个简单的args列表)
-
-r
选项告诉locate将您的arg视为正则表达式模式。 -
引号保护*免受 shell filename-expansion的影响。它意味着*和点。现在是特殊的正则表达式字符
-
作为正则表达式,您可以通过各种方式告诉’locate’匹配其数据库条目:eg1。
locate -r "^/bin/b.*"
生成以/bin /b … eg2开头的文件名。locate -r ~/"bin/b.*"
生成以/home /user /bin /b开头的文件名。注意〜/不受”quotation-marks”保护,因此受到shell tilde-expansion的约束,它将〜/into转换为/home /user /
总结:“shell filname扩展”与’regex’完全不同
现在回到原帖:
locate
通常将整个数据库列为stdout,因此要将其限制为您需要对其进行过滤的特定目录…您可以通过locate的选项来完成此操作。
您可以使用locate的正则表达式功能,而不仅仅是shell-globbing …(locate /dir/myfile*
是shell-globbing)…
从信息位于:-r
,--regex
-
“…(正则表达式)匹配是针对整个路径名执行的,因此默认情况下,如果路径名的任何部分与指定的正则表达式匹配,则匹配路径名。正则表达式可以使用^或$来锚定匹配路径名的开头或结尾。“
注意:-i =忽略大小写。 。 。 。 。 -r =正则表达式。 。 。 。 。 〜/将由shell扩展到/home /user(当〜/不在引号中时)。 。 。 。 。 ‘\'(baskslash + space;无引号)是一个文字空间(以避免shell扩展)。你可以把字符串放在引号中,但一定要留在引号之外的〜/~/my\ regex
或-/"my regex"
例如。 locate -ir ~/".*"la\ bella\ vita
与locate -ir ~/".*la bella vita"
相同,将在您的整个主目录中搜索“La Bella Vita”。
您也可以将搜索限制为仅使用文件名,但使用-b
或--basename
..在这种情况下,正则表达式start-of-line ^
仅适用于基本名称…
我最常发现自己使用的是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
。没有找到的那么快,因为没有要搜索的数据库…它实际上搜索文件系统。如果您打算对文件执行某些操作,那么除了打印之外,您还可以使用许多选项。