关于find . -name *h命令报错及返回结果不符合预期的问题求助
关于
find . -name *h命令的两个问题解析 咱们一个个来拆解你遇到的这两个问题,其实根源都和shell对通配符的预处理逻辑有关:
问题1:find: paths must precede expression 报错原因
这个报错完全是shell抢在find命令之前处理了通配符导致的。当你输入find . -name *h时,bash/zsh这类shell会先解析*h这个通配符,把它替换成当前目录下所有以"h"结尾的文件名。举个例子:如果当前目录有foo.h和bar.h两个文件,shell会偷偷把你的命令改成:
find . -name foo.h bar.h
这时候find就懵了——它的语法要求路径参数必须在表达式前面,现在bar.h被当成了路径之后的表达式参数,不符合规则,所以直接抛出paths must precede expression的错误,同时给你甩用法提示。
解决方法:把通配符用单引号或双引号括起来,让shell别乱改,把*h原封不动传给find处理:
find . -name "*h"
问题2:返回结果同时包含.h和.cpp文件的原因
这个问题同样和shell的通配符扩展脱不了干系,分两种常见场景:
- 场景一:当前目录存在以"h"结尾的
.cpp相关文件(比如test.cpph),shell会把*h扩展成包括这个文件在内的所有以h结尾的文件名,find就会按照这些指定的文件名去查找,自然会出现带cpp的结果。 - 场景二:如果当前目录没有任何以h结尾的文件,shell会把
*h原样传给find(这时候不会触发第一个报错),但find的-name参数遵循shell通配符规则,*h表示任意字符序列结尾为h——如果你的.cpp文件名里包含h(比如main.h.cpp),或者你本来想匹配.h文件却少写了点(应该用*.h而非*h),就会误匹配到.cpp文件。
正确写法:如果你只想找所有.h头文件,一定要用引号括住*.h,精准匹配:
find . -name "*.h"
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

