我需要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 都有一个选项:mlocate
locate
-l
locate -l1 mylib
如果没有,您将不得不假设文件名不包含换行符并将locate
to的输出通过管道传输head -n 1
(某些实现locate
支持-0
使用 NUL 字符而不是换行符分隔结果的选项,但-l
无论如何它们也支持)。