Linux如何递归查找文件名及内容均含指定字符串的文件
原命令失效原因
你之前执行的grep -r content_string /dir/*name_string*拿不到预期结果,核心问题是shell会在grep运行前先展开/dir/*name_string*通配符:这个规则只会匹配/dir根目录下文件名直接包含name_string的文件和目录,不会递归遍历所有子目录里名字符合要求的文件,搜索范围从一开始就不对。
正确实现方案
方案1:find + grep 组合(全环境兼容)
这个写法符合POSIX标准,在任何类Unix系统的Shell里都能跑,没有特殊依赖:
find /dir -type f -name "*name_string*" -exec grep -l "content_string" {} +
参数说明:
-type f:只匹配普通文件,过滤掉目录、软链接、设备文件等特殊文件,避免无效搜索和报错-name "*name_string*":匹配文件名任意位置(开头、中间、末尾)包含name_string的文件,前后的*通配符覆盖所有位置的匹配场景-exec grep -l "content_string" {} +:把find找到的符合文件名规则的文件批量传给grep做内容匹配,-l参数表示只输出匹配到目标内容的文件路径;如果需要看具体匹配的内容行,直接去掉-l参数就行。
方案2:GNU grep 直接递归(Linux发行版通用,写法更简洁)
绝大多数Linux发行版默认带的GNU grep支持--include参数,可以直接过滤文件名做递归搜索,不用配合find:
grep -r -l --include="*name_string*" "content_string" /dir
参数说明:
-r:递归遍历指定目录下的所有子目录--include="*name_string*":只在文件名匹配该通配符规则的文件里搜内容,规则会递归生效到所有子目录- 同样,要查看具体匹配行就删掉
-l参数,需要忽略大小写匹配可以加-i参数,按需调整即可。
内容的提问来源于stack exchange,提问作者Rocco B.
相关产品推荐
相关产品推荐

