如何仅对目录使用locate

如何仅对目录使用locate

这会找到“Dropnot”各个子目录下的大量文件

$ locate Dropnot

我可以找到只是目录位置与locate? (“Dropnot”在哪个目录中)

因此,如果Dropnotis in /home/me/,则这是返回的唯一条目。

如果是这样,最简单/最短的方法是什么?

最好是通过标志或符号,而不是通过管道输出并查找它等,但我会采取任何措施。

也许某种 Dropnot$ 表示行尾? (但没有用)。

答案1

我已经mlocate安装了。它是 RedHat 默认分发的,因此它将在 Fedora、RHEL、CentOS 上运行。从man locate

-b, --basename
       Match only against the file name portion of the path name,  ie.,  the  
       directory  names will be excluded from the match (but still printed). 
       This does not speed up the search, but can suppress uninteresting matches.

因此,如果您运行locate -b '/Dropknot',它只会报告具有该字符串的文件或目录。

答案2

没有选项可用于locate查找选定的文件类型(如目录),但您可以使用问题中的语法 -Dropnot$查找以Dropnot.为此,您必须使用-e选项来定位以打开 POSIX 正则表达式。

在这种情况下,您应该使用:

locate -e Dropnot$

您拥有什么版本的定位非常重要。在我的系统(Gentoo Linux)中,我有安全定位:

$ locate --version
Secure Locate 3.1 - Released March 7, 2006

其中 的答案中没有--basename选项uther。该选项由 findutils 包中的 GNU Locate 提供:

$ ./locate --version
locate (GNU findutils) 4.4.2

如果您想将 regexp 与 GNU Locate 一起使用,您应该使用-rswitch -e

答案3

使用 GNU 定位(其他定位实现可能有所不同):

locate '*/Dropnot'
locate Dropnot | grep '/Dropnot$'

当参数中没有通配符时,locate查找具有指定搜索词作为子字符串的路径。当参数是包含一个或多个通配符的 shell 模式时,locate查找完全匹配。如果你不想/Dropnot在最后输出:

locate -0 '*/Dropnot' | xargs -0 -n1 dirname
locate Dropnot | sed -n 's:/Dropnot$::p'

答案4

如果您使用的是 RedHat,您可能安装了 mlocate,而不是 Secure Locate。在这种情况下,没有 -e 选项,您必须使用 -r 或 --regexp 来使用基本正则表达式进行搜索。

相关内容