Bash的glob模式中*通配符是否可以匹配连字符?
问题原因解答
你遇到的现象和glob通配符本身的规则无关,核心原因是shell的通配符预展开机制,而非find的匹配逻辑有问题:
- 当你没有给命令里的通配符加引号时,shell会先在当前工作目录下匹配符合通配符规则的文件,用匹配到的文件名替换掉通配符后,才会把最终参数传递给find命令执行。
- 第一次执行
find . -iname *.properties时,你的当前工作目录下刚好只有gradle.properties这一个符合*.properties规则的文件,shell会直接把命令替换为find . -iname gradle.properties传给find,自然只会搜索名字完全匹配gradle.properties的文件,找不到带连字符的cfg-local.properties。 - 第二次执行
find . -iname *-*.properties时,你的当前工作目录下不存在符合*-*.properties规则的文件,shell无法完成预展开,就会把*-*.properties原样作为参数传给find,此时find自身的glob匹配逻辑才会生效,递归在所有子目录下查找符合规则的文件,所以输出了你需要的cfg-local.properties结果。
正确写法
如果要让find来处理通配符的递归匹配,需要给带通配符的参数加上单引号或双引号,避免shell提前展开:
find . -iname '*.properties'
执行以上命令就能找到所有后缀为properties的文件,包含你要的cfg-local.properties。
内容的提问来源于stack exchange,提问作者Alan Evangelista
相关产品推荐
相关产品推荐

