当前位置: 首页>>技术教程>>正文


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

, ,

问题描述

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

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

感谢致敬!

最佳解决办法

更新:关于使用locate的正则表达式选项与shell的filename expansion关于locate的args的注释…

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

  1. 首先,shell filename-expansion将扩展特殊的shell模式charecter *(这是因为*是不受保护的,即没有”double-quotes”)

  2. 生成的扩展是文件名列表。这可能很长…这个列表被传递给locate作为许多单独的命令行args。

  3. 然后,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列表)

  1. -r选项告诉locate将您的arg视为正则表达式模式。

  2. 引号保护*免受 shell filename-expansion的影响。它意味着*和点。现在是特殊的正则表达式字符

  3. 作为正则表达式,您可以通过各种方式告诉’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\ vitalocate -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。没有找到的那么快,因为没有要搜索的数据库…它实际上搜索文件系统。如果您打算对文件执行某些操作,那么除了打印之外,您还可以使用许多选项。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/2133.html,未经允许,请勿转载。