在定位搜索中排除目录

Vol*_*gel 17 directory find files locate

使用locate查找文件系统中的路径进行搜索。
通常,您先验地知道您只对文件感兴趣,或者只对目录感兴趣。
“定位”搜索通常会返回许多结果。在结果中只包含一种类型会很有用,因为它有助于缩短输出。

但是有一个更有趣的论点是忽略文件或目录:因为结果路径列表可能不明确 - 不仅在理论上。

下面的例子是一个真实的案例,并不罕见:

$ locate --regex --basename "xfce4-keyboard-overlay$"
/usr/local/bin/xfce4-keyboard-overlay
/usr/local/share/xfce4-keyboard-overlay
Run Code Online (Sandbox Code Playgroud)

好的,我们发现了一些东西!但是...文件或目录?

$ file /usr/local/bin/xfce4-keyboard-overlay 
/usr/local/bin/xfce4-keyboard-overlay:   bash script
Run Code Online (Sandbox Code Playgroud)

所以这是一个文件...

$ file /usr/local/share/xfce4-keyboard-overlay
/usr/local/share/xfce4-keyboard-overlay: directory
Run Code Online (Sandbox Code Playgroud)

而第二个不是。

这种歧义使长长的路径列表难以阅读,因此将目录过滤掉会非常好,例如使用locate.

这样的东西存在吗?即使目录过滤器与定位分开?

至少,可以使用脚本来迭代所有要检查的文件名——这可能很慢。

Sté*_*las 5

zsh

print -rC1 ${(0)^"$(locate -0 ...)"}(N.)
Run Code Online (Sandbox Code Playgroud)

(0)是一个参数扩展标志,它以 NUL 字符(如我们使用的locate -0)分割,是 的缩写(ps:\0:)

对于^,我们不是(N.)在数组末尾添加,而是将其添加到每个元素。

(N.)是一个 glob 限定符,.仅匹配常规文件,N如果不匹配(不存在或不是常规文件,或者我们无法检查)则删除元素。您还可以使用^/代替来.匹配非目录而不是仅匹配常规文件。或者在符号链接解析后-.确定文件的类型(包括匹配中常规文件的符号链接)。

print -rC1在 olumn上原始打印每个参数1 C(与每行写入一个参数相同-l,除非没有任何内容可打印,在这种情况下,在打印一个空行时print -C1不输出任何内容)。print -l

您可以使用任何zshglob 限定符,但请注意,排序限定符不会产生任何效果,因为我们在这里为每个文件扩展一个 glob,因此每个文件只有一个要排序。

为了更好地识别哪些文件是可执行文件/目录/符号链接/套接字...,您还可以将结果文件作为参数传递ls -F以附加一些*/@=...后缀

这里假设 GNU 工具和类似 Bourne 的 shell:

elocate() {
  locate -0e "$@" |
    sort -z |
    xargs -r0 ls --quoting-style=shell --color=always -Fd1U |
    less -FIXR
}
Run Code Online (Sandbox Code Playgroud)

将定义一个elocate函数,该函数给出 的彩色和分页版本locate,并以 shell 样式引用文件名以避免歧义,并附加后缀以给出类型指示。


Flo*_*elf 2

locate --null --regex --basename "xfce4-keyboard-overlay$" |
  xargs -r0 sh -c 'find "$@" -prune ! -type d' sh
Run Code Online (Sandbox Code Playgroud)

  • 将“xargs”与“find”一起使用是一个好主意,我对其进行了编辑以使其变得健壮。希望你不介意。 (2认同)