find 无法列出所有文件

find 无法列出所有文件

我试图列出 中的所有文件usr,其路径包含关键字“x86_64-linux-gnu”。例如,/usr/bin/x86_64-linux-gnu-gcc-ranlib-5

首先,我执行这样的命令:

find /usr -name "*x86_64-linux-gnu*" | wc -l

输出是232。我能感觉到它不正确。

然后我执行另一个命令:

find /usr -name "*" | grep x86_64-linux-gnu | wc -l

输出是 3700,这是正确的。

为什么第一个命令没有按预期工作?

答案1

如果您正在查找其以下位置的所有文件路径包含x86-64-linux-gnu,您需要使用-path,而不是-name

find /usr -path "*x86_64-linux-gnu*" | wc -l

-name仅与基本文件名匹配,而-path与完整路径匹配(由 构造find,因此从命令行上给出的初始路径之一开始)。查看第一个命令的输出将说明这一点:

find /usr -name "*x86_64-linux-gnu*" | less

您将看到x86_64-linux-gnu与其自身匹配的文件和目录,例如/usr/include/x86_64-linux-gnu/usr/lib/ccache/x86_64-linux-gnu-g++/usr/lib/python3.5/lib-dynload/_bz2.cpython-35m-x86_64-linux-gnu.so,但看不到/usr/include/x86_64-linux-gnu/curl您的grep变体或-path上面的变体所匹配的文件和目录。

这两个表达式及其适当的使用在联机find(1)帮助页(一如既往,man find首先查看您自己的系统)。

答案2

man find

   -name pattern
          Base of file name (the path with the leading directories removed) matches
          shell pattern pattern.

第一种格式 ( -name "*x86_64-linux-gnu*") 仅与文件的姓名匹配pattern。如果它们位于名称与模式匹配的目录中,则它们将不会匹配。然而,后一种格式(-name "*"with grep)确实与这些相匹配。

相关内容