如何找出目录内有多少个以 .c 或 .cpp 结尾的文件包含字符串:string?

如何找出目录内有多少个以 .c 或 .cpp 结尾的文件包含字符串:string?

如何找出目录内有多少个以 .c 或 .cpp 结尾的文件包含字符串:string?

该字符串可以出现在整个文件中的任何位置,包括注释或作为较大字符串的一部分。

答案1

如果你知道你的文件名不能包含换行符,那么

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

答案2

grep -l string *.c *.cpp | wc -l
  • 如果任何文件名包含换行符,计数将会太高。
  • 如果 glob 匹配失败,您将收到类似这样的错误grep: *.c: No such file or directory,但计数仍然正确。

这就像一个快速而肮脏的版本steeldriver 的回答

答案3

使用grep命令来查找:

find /path/to/directory -type f \( -name "*.c" -o -name "*.cpp"  \) -exec grep "string" {} \; | wc -l

答案4

我建议使用该工具ripgrep折断)用于这些类型的任务(在源代码存储库中进行 grepping):

$ 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.

相关内容