查找名称与掩码匹配的文件或文件的符号链接

查找名称与掩码匹配的文件或文件的符号链接

我正在使用 进行搜索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 find4.9 或更高版本将列出所有ase 名称以 开头的locate文件,并过滤那些可以确定为bgccfind常规文件符号链接解析后。

或者与 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

相关内容