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.
这样的东西存在吗?即使目录过滤器与定位分开?
至少,可以使用脚本来迭代所有要检查的文件名——这可能很慢。
和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 样式引用文件名以避免歧义,并附加后缀以给出类型指示。
locate --null --regex --basename "xfce4-keyboard-overlay$" |
xargs -r0 sh -c 'find "$@" -prune ! -type d' sh
Run Code Online (Sandbox Code Playgroud)