如何递归地grep,但仅限于具有特定扩展名的文件?

如何递归地grep,但仅限于具有特定扩展名的文件?,grep,Grep,我正在编写特定目录的脚本: { grep -r -i CP_Image ~/path1/; grep -r -i CP_Image ~/path2/; grep -r -i CP_Image ~/path3/; grep -r -i CP_Image ~/path4/; grep -r -i CP_Image ~/path5/; } | mailx -s GREP email@domain.com 如何将结果仅限于扩展名.h和.cpp?使用: find . -name '*.h' -o -na

我正在编写特定目录的脚本:

{ grep -r -i CP_Image ~/path1/;
grep -r -i CP_Image ~/path2/;
grep -r -i CP_Image ~/path3/;
grep -r -i CP_Image ~/path4/;
grep -r -i CP_Image ~/path5/; }
| mailx -s GREP email@domain.com
如何将结果仅限于扩展名
.h
.cpp

使用:

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print
只需使用
--include
参数,如下所示:

grep -inr --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com
那应该是你想要的

要从下面进行解释:

  • grep
    :命令

  • -r
    :递归

  • -i
    :忽略大小写

  • -n
    :每个输出行前面都有文件中的相对行号

  • 代码>包含\*.CPP:**.CPP:C++文件(如果你有一个带有文件名星号的目录,就可以逃逸)

  • /
    :从当前目录开始

您应该为每个“-o-名称”写“-exec grep”:

或按()


选项'-Hn'显示文件名和行。

以下是我通常用于查找.c和.h文件的方法:

或者,如果您还需要行号:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -nH "#include"

HP和Sun服务器上没有任何
-r
选项,但这种方式在我的HP服务器上非常有效:

find . -name "*.c" | xargs grep -i "my great text"

-i
用于不区分大小写的字符串搜索。

其中一些答案似乎语法太重,或者在我的Debian服务器上产生了问题。这对我来说非常有效:

grep -r --include=\*.txt 'searchterm' ./
…或不区分大小写的版本

grep -r -i --include=\*.txt 'searchterm' ./
  • grep
    :命令

  • -r
    :递归

  • -i
    :忽略大小写

  • --包含
    :所有*.txt:文本文件(用\转义,以防文件名中有带星号的目录)

  • 'searchterm'
    :要搜索的内容

  • /
    :从当前目录开始

来源:

既然这是一个查找文件的问题,让我们使用
查找

使用GNU find,您可以使用
-regex
选项在目录树中查找扩展名为
.h
.cpp
的文件:

find -type f -regex ".*\.\(h\|cpp\)"
#            ^^^^^^^^^^^^^^^^^^^^^^^
然后,只需对每个结果执行
grep

find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +
如果没有这种find分布,则必须使用类似的方法,使用
-o
连接选项(名称以
.h
.cpp
结尾):


如果您真的想使用
grep
,请按照
--include
指示的语法进行操作:

grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^
最简单的方法是:

find . -type  f -name '*.extension' 2>/dev/null | xargs grep -i string
添加
2>/dev/null
以终止错误输出

要在整个系统中包含更多文件扩展名和密码grep,请执行以下操作:

find/-type f\(-name'*.conf'-o-name“*.log”-o-name“*.bak”\)2>/dev/null|
xargs grep-i密码
(银色搜索器)对此有非常简单的语法

       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.
所以

ag-G*.h-G*.cpp CP\u图像
这个答案很好:

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com
但它可以更新为:

grep -r -i --include \*.{h,cpp} CP_Image ~/path[12345] | mailx -s GREP email@domain.com

这可能更简单。

如果要从另一个命令(例如“git”)的输出中筛选出扩展名:


尝试了
grep-r-i CP_Image~/path1/.{h,cpp}
?使用:
ag-i CP_Image~/path[1-5]| mailx-s grepemail@domain.com
。工作完成。可能重复使用egrep(很可能预先安装在您的系统上),然后您就可以使用正则表达式了。GNU的家伙们在
-r
中添加
-r
以让它搜索文件时真的搞砸了,因为这打破了UNIX中“只做一件事,而且做得很好”的口头禅。有一个非常好的工具可以用来查找具有非常明显名称的文件。我建议将那些
-name
参数分组。如果你不这样做,奇怪的事情就会发生<代码>查找\(-name'*.h'-o-name'*.cpp'\)-exec grep“CP_Image”{}\-打印
与其他“-type f”一起使用可忽略所有目录对象,仅对文件感兴趣。我使用此方法多年,效果很好,但比递归grep慢得多,因为find的exec为要搜索的每个文件生成一个单独的grep进程。寻址@beudet的注释,
find
可以选择性地捆绑参数,将被调用进程的调用减少到最低限度<代码>查找\(-name\*.h-o-name\*.cpp\)-exec grep-h CP_Image{}+
这是建议的,但在@fedorqui下面的答案中没有突出显示,是值得改进的。当find仅标识单个匹配文件时,grep的
-H
参数非常有用。这可以避免在答案中使用
-print
。如果文件的总列表足够小,则使用递归shell glob(例如
{path1,path2}/***.{cpp,h}
)可能更可取。作为记录:-r(递归)-i(忽略大小写)-include(仅搜索与文件模式匹配的文件)可以进一步优化为
grep-r-i--include\*.h--include\*.cpp CP_Image~/path[12345]
@Hong,-R用于符号链接的文档在哪里?这个例子似乎得分很高,因为它涵盖了如此广泛的可能性,但下面给出的grep-R的答案是include=*.txt“searchterm”。/真的解释了答案的本质为什么不使用双引号而不是反斜杠?e、 g:
grep-r-i--include=“*.h”--include=“*.cpp”CP_Image
grep-rn“grep的某些东西”--include=*.{module,inc,c,h}*回答得不错。比IMO上接受的更干净,但您应该添加搜索条件,如@ashish notedwhy is
——在针后包括
选项,而不是其他选项?@vladkras,你说的针是什么意思?是
--
?差不多了,但这对我不起作用——它一直在尝试匹配
--include=*.foo
。工作解决方案是将
--include
值括在引号中。例如,
--include=“*.foo”
。我遇到过几家网络托管公司的服务器,它们没有适用于fgrep的--include选项,这是我在中使用的命令行
grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^
find . -type  f -name '*.extension' 2>/dev/null | xargs grep -i string
       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.
ag -G *.h -G *.cpp CP_Image <path>
grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com
grep -r -i --include \*.{h,cpp} CP_Image ~/path[12345] | mailx -s GREP email@domain.com
files=$(git diff --name-only --diff-filter=d origin/master... | grep -E '\.cpp$|\.h$')

for file in $files; do
    echo "$file"
done