如何仅用grep在指定子目录下递归匹配特定XML文件
仅用grep实现指定子目录下.xml文件的精准搜索
你完全可以只用grep来实现这个需求,关键是正确利用--include参数的路径匹配能力——在递归搜索时,grep的--include不仅能匹配文件名,还能匹配相对搜索起始目录的完整路径。
正确的命令写法
直接运行以下命令即可,它会自动排除.git和.svn目录,且仅搜索所有/bar/子目录下的.xml文件,同时支持你添加额外grep选项和指定起始搜索目录:
grep -r --exclude-dir={.git,.svn} --include='*/bar/*.xml' "pattern" [你的起始目录...]
为什么这个命令能生效?
--exclude-dir={.git,.svn}:和你之前的用法一样,直接跳过版本控制目录,避免不必要的搜索--include='*/bar/*.xml':这里用单引号包裹模式,防止shell提前解析星号。这个模式会匹配所有路径中包含/bar/且以.xml结尾的文件——不管bar在路径的哪个层级(比如path2/foo/bar/、path3/bar/、path3/foo/bar/baz/里的xml文件都会被匹配)- 末尾的
[你的起始目录...]:你可以在这里添加用户指定的一个或多个起始搜索目录,完全满足脚本的灵活性需求
对比你之前的尝试
- 你之前用
grep -v /bar/的方式是事后过滤,grep会先搜索所有符合条件的xml文件,再过滤掉结果,效率很低;而这个命令是前置匹配,搜索阶段就只定位目标文件,效率和find相当 - 你之前试的
--include=\*/bar/\*.xml其实思路是对的,但问题出在转义上——用单引号包裹模式就可以避免shell解析星号,让grep正确识别路径模式 - 相比find命令,这个grep命令保留了grep原生的选项支持,你可以直接在命令中添加用户指定的grep参数(比如
-n显示行号、-i忽略大小写等),无需额外处理
用你给出的文件列表测试,这个命令只会命中file5.xml、file7.xml、file8.xml三个目标文件,完全符合你的要求。
内容的提问来源于stack exchange,提问作者OnlineCop
相关产品推荐
相关产品推荐

