我正在使用 进行搜索sudo find / -name gcc*
。它返回一堆目录,而我只想要文件。但如果我添加-type f
,它就不会列出符号链接,这也是我想要的。如何过滤掉目录,但保留符号链接?
此外,我注意到尽管使用了*
通配符,但它无法列出名为gcc-10
.不find
支持通配符?还有其他实用程序可以做到这一点吗?
答案1
通过 GNU 实现find
,您可以使用:
find / -name 'gcc*' -xtype f
type
用于在符号链接解析后检查文件。
使用zsh
递归 glob,可以通过以下方式实现相同的效果:
print -rC1 /**/gcc*(-.)
其中glob 限定符导致在符号链接解析后应用-
以下限定符(此处.
相当于)。-type f
如果可用find
,您还可以使用locate
通常更快的方法来代替使用 ,因为它在已构建的数据库中查找文件。
locate -b0 'gcc*' | find -files0-from - -prune -xtype f
使用 GNU find
4.9 或更高版本将列出所有ase 名称以 开头的locate
文件,并过滤那些可以确定为b
gcc
find
常规文件符号链接解析后。
或者与 glob 相同zsh
:
print -rC1 ${(0)^"$(locate -b0 'gcc*')"}(N-.)
Perl 对此也很有用,因为它的-f
运算符[
/test
可以测试常规的默认情况下,符号链接解析后的文件,因此您可以执行以下操作:
locate -b0 'gcc*' | perl -l -0ne 'print if -f'
这将几乎立即为您提供结果,而无需爬行整个文件系统(尽管可能会丢失上次locate
更新数据库后添加的一些文件)。
答案2
从man find
:
-type c
File is of type c:
[...]
f regular file
[...]
l symbolic link; this is never true if the -L option or the -follow option is in effect, unless the symbolic link is broken. If you want to search for symbolic links
when -L is in effect, use -xtype.
为了find
显示符号链接和文件,请使用参数-type f,l
。
关于通配符:find
确实支持通配符。但由于您没有引用表达式(-name gcc*
而不是-name 'gcc*'
),因此您的 shell 将在运行之前扩展gcc*
到当前工作目录中与此通配符表达式匹配的所有文件find
。 (如果这与多个文件匹配,则find: paths must precede expression
在调用时会出现错误,这也在 . 中进行了解释man
。)
因此,如果当前工作目录中有一个名为的文件gcc-xyz
,则您的 shell 将运行find -name gcc-xyz
。