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

Tim*_*Tim 52 command-line files

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

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

感谢致敬!

Pet*_*r.O 34

更新:关于使用 locate 的regex 选项与 shell 的文件名扩展相对于 locate 的 args 的说明...

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

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

但是请注意,'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 文件名扩展”与“regex”完全不同

现在回到原来的帖子:


locate 通常将整个数据库列出到标准输出,因此要将其限制在特定目录中,您需要对其进行过滤...您可以通过 locate 的选项来执行此操作。

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

信息定位-r--regex

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

注意: -i = 忽略大小写
。. . . . -r = 正则表达式
。. . . . ~/ 将被 shell 扩展为 /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 的数据库...(但如果您是新添加的,您可能知道它在哪里:)....


Ada*_*tek 17

通过 grep 管道它,像这样

$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless
Run Code Online (Sandbox Code Playgroud)

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

  • 少找| grep ^/bin 比 locate -r ^/bin/.*less 快得多,因为 locate less 将执行对单词 less 的有效搜索,而 locate -r 将在locatedb 中的所有条目上执行正则表达式操作 (3认同)

Ner*_*est 8

您可以使用locate /rootpath/*filenamespec。我以前没有尝试过,但它似乎有效。做你的例子,这将是locate /home/tim/science/*math*

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