我试图列出 中的所有文件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
)确实与这些相匹配。