How do I use grep to search the current directory for all files having the a string “hello” yet display only .h and .cc files?
如何使用grep搜索当前目录中包含字符串"hello"的任何和所有文件,并仅显示.h和.cc文件?
1
| 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。
- 我也需要所有的子目录
- 向该查询添加-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文件。为了满足您的准确要求,我在此提交:
显示文件名:
1
| grep -lR hello * | egrep '(cc|h)$' |
…显示文件名和内容:
1
| grep hello `grep -lR hello * | egrep '(cc|h)$'` |
要在当前目录中递归搜索:
如果需要递归搜索,您可以有多种选择。你应该考虑一下ack。
否则,如果您有GNU find和xargs:
1
| find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null |
使用/dev/null确保打印文件名;-print0和-0处理包含空格(换行符等)的文件名。
如果您没有顽固的名字(带空格等),可以使用:
1
| find . -name '*.*[ch]' -print | xargs grep hello /dev/null |
这可能会得到一些您不想要的名字,因为模式匹配更模糊(但更简单),但其他方面也可以。它与find和xargs的非GNU版本一起工作。
- 注意,你也可以说find ... -exec grep"hello" {} +。
1
| grep -l hello **/*.{h,cc} |
如果没有.h或.cc文件,您可能希望shopt -s nullglob避免出现错误消息。
- 我加了什么?
- RTM:男.cx/grep
- 我知道如何使用谷歌等。我在这里问它是因为几个答案都有"-l",而且很高兴把所有信息放在一个地方。
- -L(小写"el")抑制正常输出。打印通常从中打印输出的每个输入文件的名称。扫描/搜索将在第一次匹配时停止。
最简单的方法:grep-ril"你的文本"/
- 这不仅显示.h或.cc文件,还可以解释使用的选项以及原因。