Linux下如何递归查找含指定短语的.md文件所在目录
原命令失效原因
你之前的命令存在两个问题,导致结果不符合预期:
- 管道传递给grep的是find输出的文件路径字符串,此时grep没有收到要扫描的目标文件参数,
-r递归参数不生效,只会匹配管道传过来的路径文本本身,不会读取对应md文件的内容做检索 - 即使grep正确匹配到文件内容,默认输出的是文件自身路径,不会返回文件所在的目录名,和你要的结果不匹配
可用命令
直接执行下面的命令即可实现需求:
find ./dev -type f -name "*.md" -exec grep -l "type: game" {} \; | xargs dirname
命令逻辑说明
find ./dev -type f -name "*.md":指定从dev目录开始遍历,筛选所有后缀为.md的普通文件-exec grep -l "type: game" {} \;:对每一个找到的md文件,检索文件内容是否包含type: game字段,-l参数表示匹配成功后输出该文件的完整路径| xargs dirname:将前面输出的所有匹配文件的路径传给dirname命令,提取每个文件对应的上级目录名称,也就是你需要的项目文件夹名
如果你的目录或文件名可能包含空格、特殊字符,推荐使用兼容性更好的写法,避免路径解析错误:
find ./dev -type f -name "*.md" -exec grep -lZ "type: game" {} \; | xargs -0 dirname该写法通过
-Z和-0参数使用null字符分隔路径,支持所有合法的文件、目录命名格式。
内容的提问来源于stack exchange,提问作者marti
相关产品推荐
相关产品推荐

