Как найти и подсчитать, сколько файлов содержат определенное слово?

Как найти и подсчитать, сколько файлов содержат определенное слово?

Мне нужно найти и отобразить количество файлов, содержащих слово «морковь» (регистр не учитывается)

Пока что это то, что у меня есть, я просто не уверен, как добавить в него wc, чтобы посчитать, сколько файлов содержит слово carrot.

найти . -exec grep -i морковь {} \;

решение1

Прежде всего, как уже говорили другие, нет смысла использовать find, просто используйте рекурсивный grep:

grep -irm 1 carrot . | wc -l 

Гарантирует -m 1, что grepостановит поиск каждого файла после первого совпадения. Без этого вы не считаете количествофайлыкоторые содержат carrot, но числолинии, один и тот же файл будет учтен несколько раз, если он содержит несколько экземпляров carrot. Из man grep:

    -r, --recursive
          Read all files  under  each  directory,  recursively,  following
          symbolic  links  only  if they are on the command line.  This is
          equivalent to the -d recurse option.
   -i, --ignore-case
          Ignore  case  distinctions  in  both  the  PATTERN and the input
          files.  (-i is specified by POSIX.)
   -m NUM, --max-count=NUM
          Stop reading a file after NUM matching lines. 

Если вы действительно хотите сделать это с помощью find, вы можете сделать

find . -type f -exec grep -im 1 carrot {} \; | wc -l

Обратите внимание, что я указываю именно так, -type fпоскольку вам не нужны grepкаталоги.

решение2

Найдите количество файлов, содержащих словоморковь

number_of_files=`grep -l -r -i "carrot" . | wc -l`

Значение grepаргументов:

-l, --files-with-matches
         Only the names of files containing selected lines are written to standard output.  grep will only search a file until a match has been found, making
         searches potentially less expensive.  Pathnames are listed once per file searched.  If the standard input is searched, the string ``(standard
         input)'' is written.

-R, -r, --recursive
         Recursively search subdirectories listed.

-i : case insenstive

wc -l: выводит количество строк, переданных в качестве входных данных в программу. В нашем случае эти строки — имена файлов с соответствующим шаблоном входных данных, найденным grep.

Распечатать вывод

echo $number_of_files

решение3

Вариантом решения smRaj будет двойной вызов grep. Следующий вариант даст тот же результат, что игрэп[и т. д.]| туалет -л:

grep -l -r -i "carrot" . | grep -c .

Следующий код выведет пронумерованный список файлов, содержащих искомое слово.

grep -l -r -i "carrot" . | grep -n .

Связанный контент