仅保留定位输出中的第一个匹配项

仅保留定位输出中的第一个匹配项

我需要locate在我的系统上建立一个库,并且它的名称预计会被找到几次。我只想保留第一次出现的情况。

到目前为止,我已经尝试了一些按换行符分割字符串的方法,但似乎都不适用于locate的输出。

我没有使用,find因为我事先不知道库可能在哪里。

也欢迎任何其他(更好)的方法来处理这个问题。

答案1

有多种方法可以过滤 的输出locate

方法#1 - 明确

如果您知道您正在寻找该库的特定版本,那么只需直接询问即可locate

$ locate libstdc++-3-libc6.2-2-2.10.0.so
/usr/lib/libstdc++-3-libc6.2-2-2.10.0.so

方法#2 - grep

如果您正在寻找 glibc .so 库,则使用 来grep仅查找来自 .so 的这些结果locate

$ locate libstdc++ | grep ".so$"
/usr/lib/libstdc++-3-libc6.2-2-2.10.0.so
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/32/libstdc++.so

方法 #3 - 只返回结果的前 10 行

如果您对查找第一个结果更感兴趣,请使用head仅返回前几个结果。您可以head使用开关直接返回不同数量的结果-#(更短但非标准的等效项-n #):

例子

$ locate glibc | head -8
/usr/lib64/glib-2.0/include/glibconfig.h
/usr/sbin/glibc_post_upgrade.i686
/usr/sbin/glibc_post_upgrade.x86_64
/usr/share/aclocal/glibc2.m4
/usr/share/aclocal/glibc21.m4
/usr/share/doc/glibc-2.12
/usr/share/doc/glibc-common-2.12
/usr/share/doc/glibc-2.12/BUGS

(请注意,它返回 8 行,这不一定与文件路径相同,因为文件路径可以由多行组成,因为换行符与文件名中的任何字符一样有效)。

答案2

RedHat或 GNU (基于 Linux 的操作系统上最常见的两种)等一些locate实现以及大多数 BSD 都有一个选项:mlocatelocate-l

locate -l1 mylib

如果没有,您将不得不假设文件名不包含换行符并将locateto的输出通过管道传输head -n 1(某些实现locate支持-0使用 NUL 字符而不是换行符分隔结果的选项,但-l无论如何它们也支持)。

相关内容