Как может я узнавать, сколько файлов, заканчивающихся в.c или .cpp в каталоге, содержит строку: строка?

Как может я узнавать, сколько файлов, заканчивающихся в.c или .cpp в каталоге, содержит строку: строка?

Строка может произойти где угодно во всем файле, включая комментарии или как часть большей строки.

0
задан 12 January 2019 в 11:40

6 ответов

Простой способ - через 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
1
ответ дан 11 January 2019 в 21:08

Если Вы знаете, что Ваши имена файлов не могут содержать новые строки, то

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
3
ответ дан 26 October 2019 в 13:42
grep -l string *.c *.cpp | wc -l
  • Если какие-либо имена файлов будут содержать новые строки, то количество будет слишком высоко.
  • Если шарики не будут соответствовать, то Вы получите ошибку как grep: *.c: No such file or directory, но количество все еще будет корректно.

Это похоже на быструю и грязную версию ответа steeldriver.

2
ответ дан 26 October 2019 в 13:42

Используйте команду grep для обнаружения:

find /path/to/directory -type f \( -name "*.c" -o -name "*.cpp"  \) -exec grep "string" {} \; | wc -l
2
ответ дан 26 October 2019 в 13:42

Я рекомендовал бы использовать инструмент 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.
0
ответ дан 26 October 2019 в 13:42

Необходимо смочь узнать, в скольких заканчиваются файлы .c или .cpp это содержит слово "строка" путем выполнения:

cat *.c* | grep -i "string" | wc -l

0
ответ дан 26 October 2019 в 13:42

Другие вопросы по тегам:

Похожие вопросы: