如何用findstr查找同时含foo和bar的文件?报错问题求助
查找同时包含“foo”和“bar”的TXT文件:findstr正确用法与优化方案
一、解决现有步骤的报错问题
1. 正确的分步命令
你之前的报错核心是参数顺序错误和可能的文件编码问题,修正后步骤如下:
- 第一步(生成含"foo"的文件列表):
先确保临时目录存在,执行命令:md C:\tmp 2>nul findstr /P /S /I /M "foo" C:\dir\to\search\*.txt > C:\tmp\results.txt - 第二步(用列表查找含"bar"的文件):
必须把/F选项放在搜索字符串之前,正确命令:findstr /I /M /F:C:\tmp\results.txt "bar"
2. 报错原因解析
- 第一次报错:
findstr /I /M "bar" /F:C:\tmp\results.txt
findstr的语法规则是选项需放在搜索字符串和目标文件前,这条命令会把/F:C:\tmp\results.txt当成要搜索的文件名,而非指定文件列表的选项,因此提示无法打开。 - 第二次乱码报错:
FINDSTR ■C can't be opened
大概率是第一步生成的results.txt为UTF-8带BOM编码,findstr默认解析ANSI编码,会把BOM头识别为文件名的一部分,导致路径解析错误。解决方法:用记事本打开results.txt,选择「另存为」,编码选「ANSI」后重新保存。
二、更优实现方法(无需中间文件)
直接用for循环结合findstr,一步完成搜索,避免中间文件的编码问题:
for /r "C:\dir\to\search" %f in (*.txt) do @(findstr /I /M "foo" "%f" >nul && findstr /I /M "bar" "%f" >nul && echo %f)
命令解释
for /r "C:\dir\to\search" %f in (*.txt):递归遍历指定目录下的所有TXT文件findstr /I /M "foo" "%f" >nul:检查当前文件是否含"foo",>nul屏蔽无关输出&&:仅当前面的命令执行成功(文件含foo)时,才执行后面的命令findstr /I /M "bar" "%f" >nul:检查文件是否含"bar"echo %f:输出同时满足两个条件的文件路径
如果是在批处理脚本中使用,需要把%f改成%%f。
内容的提问来源于stack exchange,提问作者MetalSnake
相关产品推荐
相关产品推荐

