在文件中查找字符串的出现并通过批处理文件显示 "filename - count"
Find occurrences of a string in files and display "filename - count" through batch file
批处理文件,用于搜索目录中的每个子文件夹和每个文件,并计算特定字符串在每个文件中出现的次数。
如果输出为 "filename - count" 将很有用。
可以找到 /c "Microsoft" *.txt
如果所有文件都在一个文件夹中,则此方法有效。
如何使查找循环遍历所有子文件夹及其每个文件并显示相同的结果。
Findstr 有 /s 可以执行此操作,但在 find 上不起作用。
从命令行:
for /F "delims=" %G in ('findstr /I /S /M "Microsoft" "%CD%\*.txt"') do @find /I /C "Microsoft" "%~G" | findstr /V /R "^$"
来自批处理脚本:
set "_srch=Microsoft"
for /F "delims=" %%G in ('
findstr /I /S /M "%_srch%" "%CD%\*.txt"') do (
find /I /C "%_srch%" "%%~G" | findstr /V /R "^$"
)
省略 %CD%\
您将获得相对路径。
从 find
输出(命令行)中删除 ----------
:
for /F "delims=" %G in ('findstr /I /S /M "Microsoft" "%CD%\*.txt"') do @for /F "tokens=1,*" %H in ('find /I /C "Microsoft" "%~G"') do @echo %I
资源:键入 for /?
、find /?
、findstr /?
、set /?
或转到 An A-Z Index of the Windows CMD command line。
for /R %%i in (*.txt) do find /c "Microsoft" "%%i"
如果要抑制计数为 0 的文件,只需添加 |findstr /v " 0$"
去掉 ----------
:
for /f "tokens=1,*" %%a in ('for /R %%i in (*.txt^) do find /c "Microsoft" "%%i"^|findstr /v " 0$"') do echo %%b
(如果要包含计数为 0 的文件,请删除 ^|finstr /v " 0$"
)
这比 JosefZ 的答案快 30%。
没有使用 FIND /C 的解决方案报告搜索字符串出现的次数 - 而是报告包含至少一次搜索字符串出现的行数。
如果你真的想计算出现的次数,包括在一行中出现多次的可能性,那么一个解决方案是使用 JREPL.BAT - 一个纯脚本(混合 JScript/batch) 文本处理命令行实用程序 运行 在任何 Windows XP 以后的机器上。
@echo off
setlocal
for /r %%F in (*.txt) do (
set "file= %%F"
jrepl "Microsoft" "cnt+=1; false" /l /jmatch /jbeg "cnt=0" /jend "output.WriteLine(lpad(cnt,' ')+env('file'))" /f "%%F"
)
上面生成了一个格式良好且对齐的报告,左侧填充了计数,后跟文件名的完整路径。我使用 /L
选项进行文字搜索。我定义并使用了 file
变量,以防万一您 运行 跨越包含 '
的文件名。如果我改为传递字符串文字,则所有 '
都必须加倍。
如果你想抑制计数为 0 的文件,那么你可以简单地添加一个 if 语句:
@echo off
setlocal
for /r %%F in (*.txt) do (
set "file= %%F"
jrepl "Microsoft" "cnt+=1; false" /l /jmatch /jbeg "cnt=0" /jend "if (cnt) output.WriteLine(lpad(cnt,' ')+env('file'))" /f "%%F"
)
使用 JREPL 的美妙之处在于您可以轻松删除 /L
选项并切换到使用正则表达式,并且非常具体地说明您要搜索的字符串。
批处理文件,用于搜索目录中的每个子文件夹和每个文件,并计算特定字符串在每个文件中出现的次数。
如果输出为 "filename - count" 将很有用。
可以找到 /c "Microsoft" *.txt 如果所有文件都在一个文件夹中,则此方法有效。
如何使查找循环遍历所有子文件夹及其每个文件并显示相同的结果。
Findstr 有 /s 可以执行此操作,但在 find 上不起作用。
从命令行:
for /F "delims=" %G in ('findstr /I /S /M "Microsoft" "%CD%\*.txt"') do @find /I /C "Microsoft" "%~G" | findstr /V /R "^$"
来自批处理脚本:
set "_srch=Microsoft"
for /F "delims=" %%G in ('
findstr /I /S /M "%_srch%" "%CD%\*.txt"') do (
find /I /C "%_srch%" "%%~G" | findstr /V /R "^$"
)
省略 %CD%\
您将获得相对路径。
从 find
输出(命令行)中删除 ----------
:
for /F "delims=" %G in ('findstr /I /S /M "Microsoft" "%CD%\*.txt"') do @for /F "tokens=1,*" %H in ('find /I /C "Microsoft" "%~G"') do @echo %I
资源:键入 for /?
、find /?
、findstr /?
、set /?
或转到 An A-Z Index of the Windows CMD command line。
for /R %%i in (*.txt) do find /c "Microsoft" "%%i"
如果要抑制计数为 0 的文件,只需添加 |findstr /v " 0$"
去掉 ----------
:
for /f "tokens=1,*" %%a in ('for /R %%i in (*.txt^) do find /c "Microsoft" "%%i"^|findstr /v " 0$"') do echo %%b
(如果要包含计数为 0 的文件,请删除 ^|finstr /v " 0$"
)
这比 JosefZ 的答案快 30%。
没有使用 FIND /C 的解决方案报告搜索字符串出现的次数 - 而是报告包含至少一次搜索字符串出现的行数。
如果你真的想计算出现的次数,包括在一行中出现多次的可能性,那么一个解决方案是使用 JREPL.BAT - 一个纯脚本(混合 JScript/batch) 文本处理命令行实用程序 运行 在任何 Windows XP 以后的机器上。
@echo off
setlocal
for /r %%F in (*.txt) do (
set "file= %%F"
jrepl "Microsoft" "cnt+=1; false" /l /jmatch /jbeg "cnt=0" /jend "output.WriteLine(lpad(cnt,' ')+env('file'))" /f "%%F"
)
上面生成了一个格式良好且对齐的报告,左侧填充了计数,后跟文件名的完整路径。我使用 /L
选项进行文字搜索。我定义并使用了 file
变量,以防万一您 运行 跨越包含 '
的文件名。如果我改为传递字符串文字,则所有 '
都必须加倍。
如果你想抑制计数为 0 的文件,那么你可以简单地添加一个 if 语句:
@echo off
setlocal
for /r %%F in (*.txt) do (
set "file= %%F"
jrepl "Microsoft" "cnt+=1; false" /l /jmatch /jbeg "cnt=0" /jend "if (cnt) output.WriteLine(lpad(cnt,' ')+env('file'))" /f "%%F"
)
使用 JREPL 的美妙之处在于您可以轻松删除 /L
选项并切换到使用正则表达式,并且非常具体地说明您要搜索的字符串。