如何递归地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++文件(如果你有一个带有文件名星号的目录,就可以逃逸)
选项'-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