如何使用grep搜索当前目录中包含字符串"hello"的任何和所有文件,并仅显示.h和.cc文件?
grep -r --include=*.{cc,h}"hello" .
这意味着:在这个.目录(当前)中,递归地(在所有子目录中)搜索包含"hello"的所有.cc或.h文件。
从另一个StackOverflow问题
在最初的文章中,你说的是"当前目录",而不是递归地或者在子目录中需要它(我知道你在后面的文章中提到过它)。对于那些只关心如何在当前目录中执行此操作的人,它是grep -si"hello" --include=*.{cc,h} ./* ./.*(也搜索隐藏文件)。下面是搜索所有/隐藏文件中字符串的通用版本:grep -s"hello" * .*。可能最有用(也是最简单的),这会搜索所有非隐藏文件中的"hello":grep -si"hello" ./*,这要归功于本文:askubuntu.com/a/777456
grep -r --include=*.{java,py}"hello" .
可以传入通配符,而不是指定文件名或使用stdin。
grep hello *.h *.cc
我也需要所有的子目录
向该查询添加-R标志
不幸的是,添加-R并不起作用。它先扩展*,然后递归进行。
努法尔的答案是,如果你需要子目录,你要找的是什么
@当你问这个问题的时候,你应该清楚这点。这个答案是你所说问题的"正确"答案。
+1根据问题,这是正确的答案。
$ grep -R hello *从所有单词中查找包含hello(包括子目录)
find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep"hello"。
查看find和xargs的手册页了解详细信息。
你必须在'*.cc'之后有一个-print0,否则你在搜索的那一部分没有动作。或者你必须在里面插入括号:find . \( -name '*.cc' -or -name '*.h' \) -print0。
谢谢你注意到这一点。我已经将答案编辑为"修复"。
您还可以使用find -exec +语法而不是xargs
@乔丹姆:是的:-exec grep"hello" {} +,其中一对大括号代表文件名。好建议。
好点。我不知道江户记1〔9〕的事。
如果我仔细阅读了您的问题,您会要求grep搜索当前目录中包含字符串"hello"的任何和所有文件,并且只显示.h和.cc文件。为了满足您的准确要求,我在此提交:
显示文件名:
grep -lR hello * | egrep '(cc|h)$'
…显示文件名和内容:
grep hello `grep -lR hello * | egrep '(cc|h)$'`
要在当前目录中递归搜索:
grep -r 'myString' .
如果需要递归搜索,您可以有多种选择。你应该考虑一下ack。
否则,如果您有GNU find和xargs:
find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null
使用/dev/null确保打印文件名;-print0和-0处理包含空格(换行符等)的文件名。
如果您没有顽固的名字(带空格等),可以使用:
find . -name '*.*[ch]' -print | xargs grep hello /dev/null
这可能会得到一些您不想要的名字,因为模式匹配更模糊(但更简单),但其他方面也可以。它与find和xargs的非GNU版本一起工作。
注意,你也可以说find ... -exec grep"hello" {} +。
grep -l hello **/*.{h,cc}
如果没有.h或.cc文件,您可能希望shopt -s nullglob避免出现错误消息。
我加了什么?
RTM:男.cx/grep
我知道如何使用谷歌等。我在这里问它是因为几个答案都有"-l",而且很高兴把所有信息放在一个地方。
-L(小写"el")抑制正常输出。打印通常从中打印输出的每个输入文件的名称。扫描/搜索将在第一次匹配时停止。
最简单的方法:grep-ril"你的文本"/
这不仅显示.h或.cc文件,还可以解释使用的选项以及原因。