
Мне нужно найти и отобразить количество файлов, содержащих слово «морковь» (регистр не учитывается)
Пока что это то, что у меня есть, я просто не уверен, как добавить в него 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 .