2015-07-21 4 views
0

Пакетный файл для поиска каждой вложенной папки и каждого отдельного файла внутри каталога и подсчета количества раз, когда конкретная строка присутствует в каждом файле.Найти вхождения строки в файлы и отобразить «filename - count» через командный файл

Было бы полезно, если вывод «filename - count».

Может найти/c "Microsoft" * .txt Это работает, если все файлы находятся в одной папке.

Как сделать цикл поиска через все подпапки и каждый из его файлов и отобразить тот же результат.

Findstr имеет/s, который делает это, не работает на поиске.

+0

полный путь (начиная с 'C: \ ...') нормально для вас? – Stephan

+0

Да, Стефан, это было бы прекрасно. – macro32

+0

Обратите внимание - FIND/C сообщает количество ** строк **, содержащих строку поиска ***, а не *** количество вхождений. – dbenham

ответ

1

Из командной строки:

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.

+0

Этот метод рассчитывает _lines_, а не строки. Если есть строка с несколькими вхождениями строки, она считается как одна. – Aacini

0
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 

(удалить ^|finstr /v " 0$", если вы хотите включить файлы отсчетом = 0)

Это работает на 30% быстрее, чем ответ JosefZ.

1

Никакое решение, использующее FIND/C, не сообщает количество вхождений строки поиска - вместо этого оно сообщает количество строк, содержащих хотя бы одно вхождение строки поиска.

Если вы действительно хотите подсчитать количество вхождений, в том числе возможность более одного вхождения на одной строке, то одним из решений является использование JREPL.BAT - утилита командной строки для чистого текста (гибридная JScript/партия) который запускается на любой машине 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 счета, то вы можете просто добавить, если заявление:

@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 и переключиться на использование регулярных выражений , и быть очень конкретным относительно того, какие строки вы ищете.