Как может я узнавать, сколько файлов, заканчивающихся в.c или .cpp в каталоге, содержит строку: строка?
Строка может произойти где угодно во всем файле, включая комментарии или как часть большей строки.
Простой способ - через bash
рекурсивный глобус в сочетании с параметром single match в grep
(один файл - одно совпадение):
shopt -s globstar
grep -m 1 'string' */**.{c,cpp} | wc -l
Почему не grep -R
? Поскольку -R
просматривает все файлы и не фильтрует файлы .c
или .cpp
, мы используем подстановку bash для выполнения этой работы.
В противном случае, для независимого от оболочки способа вы можете использовать find
:
find -type f \( -iname "*.c" -or -iname "*.cpp" \) -exec grep -q 'string' {} \; -and -print | wc -l
Если Вы знаете, что Ваши имена файлов не могут содержать новые строки, то
grep -rFl --include='*.c' --include='*.cpp' string . | wc -l
Иначе
find . -type f \( -name '*.c' -o -name '*.cpp' \) -exec grep -Fq string {} \; -printf x | wc -c
grep -l string *.c *.cpp | wc -l
grep: *.c: No such file or directory
, но количество все еще будет корректно.Это похоже на быструю и грязную версию ответа steeldriver.
Используйте команду grep для обнаружения:
find /path/to/directory -type f \( -name "*.c" -o -name "*.cpp" \) -exec grep "string" {} \; | wc -l
Я рекомендовал бы использовать инструмент ripgrep (снимок) для этих видов задачи (захват в репозиториях исходного кода):
$ rg -g '*.c' -g '*.cpp' -l string | wc -l
Следующая команда может также быть полезной:
$ rg -t c -t cpp -l string | wc -l
Который ищет файлы со следующими расширениями:
$ rg --type-list | grep -E '^c:|^cpp:'
c: *.H, *.c, *.h
cpp: *.C, *.H, *.cc, *.cpp, *.cxx, *.h, *.hh, *.hpp, *.hxx, *.inl
Используемые флаги:
-l, --files-with-matches
Only print the paths with at least one match.
This overrides --files-without-match.
-g, --glob <GLOB>...
Include or exclude files and directories for searching that match the given
glob. This always overrides any other ignore logic. Multiple glob flags may be
used. Globbing rules match .gitignore globs. Precede a glob with a ! to exclude
it.
-t, --type <TYPE>...
Only search files matching TYPE. Multiple type flags may be provided. Use the
--type-list flag to list all available types.
Необходимо смочь узнать, в скольких заканчиваются файлы .c
или .cpp
это содержит слово "строка" путем выполнения:
cat *.c* | grep -i "string" | wc -l