我正在使用 进行搜索sudo find / -name gcc*
。它返回一堆目录,而我只想要文件。但如果我添加-type f
,它就不会列出符号链接,这也是我想要的。如何过滤掉目录,但保留符号链接?
此外,我注意到尽管使用了*
通配符,但它无法列出名为gcc-10
. 不find
支持通配符?还有其他实用程序可以做到这一点吗?
我正在使用 进行搜索sudo find / -name gcc*
。它返回一堆目录,而我只想要文件。但如果我添加-type f
,它就不会列出符号链接,这也是我想要的。如何过滤掉目录,但保留符号链接?
此外,我注意到尽管使用了*
通配符,但它无法列出名为gcc-10
. 不find
支持通配符?还有其他实用程序可以做到这一点吗?
通过 GNU 实现
find
,您可以使用:type
用于在符号链接解析后检查文件。使用
zsh
递归 glob,可以通过以下方式实现相同的效果:其中glob 限定符导致在符号链接解析后应用
-
以下限定符(此处.
相当于)。-type f
如果可用
find
,您还可以使用locate
通常更快的方法来代替使用 ,因为它在已构建的数据库中查找文件。使用 GNU
find
4.9 或更高版本将列出所有ase 名称以 开头的locate
文件,并过滤符号链接解析后可确定为常规文件的文件。b
gcc
find
或者与 glob 相同
zsh
:Perl 对此也很有用,因为它的
-f
运算符(如[
/test
)默认在符号链接解析后测试常规文件,因此您可以执行以下操作:locate
这将几乎立即为您提供结果,而无需爬行整个文件系统(尽管可能会丢失上次更新数据库后添加的一些文件)。从
man find
:为了
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
。