如何使用 grep 在当前目录中搜索具有字符串“hello”但仅显示 .h 和 .cc 文件的所有文件?
Posted
技术标签:
【中文标题】如何使用 grep 在当前目录中搜索具有字符串“hello”但仅显示 .h 和 .cc 文件的所有文件?【英文标题】: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? 【发布时间】:2012-03-02 07:07:31 【问题描述】:如何使用 grep 在当前目录中搜索包含字符串“hello”的所有文件并仅显示 .h 和 .cc 文件?
【问题讨论】:
【参考方案1】:grep -r --include=*.cc,h "hello" .
内容如下:递归搜索(也在所有子目录中)在此.
(当前)目录中搜索所有包含“hello”的 .cc 或 .h 文件
From another *** question
【讨论】:
在原始帖子中,您说的是“当前目录”,而没有关于递归或在子目录中需要它(我意识到您在后面的帖子中提到过)。对于那些只对如何在当前目录中执行此操作感兴趣的人,它是grep -si "hello" --include=*.cc,h ./* ./.*
(也搜索隐藏文件)。这是在所有/隐藏文件中搜索字符串的通用版本:grep -s "hello" * .*
。也许最一般有用(也是最简单的),这会在所有非隐藏文件中搜索“hello”:grep -si "hello" ./*
感谢这篇文章:askubuntu.com/a/777456
grep -r --include=*.java,py "hello" .
由于某种原因,这在 macOS 上不起作用,即使使用 GNU grep 实用程序也是如此。【参考方案2】:
您可以传入通配符而不是指定文件名或使用标准输入。
grep hello *.h *.cc
【讨论】:
我还需要所有子目录 不幸的是,添加-R
不起作用。它在递归之前扩展了*
。
Noufal 的答案是您需要子目录时所寻找的
@Jammin 您在提问时应该清楚这一点。此答案是您所述问题的“正确”答案。
$ grep -R hello *
# 从所有包含hello的单词中查找(包括子目录)【参考方案3】:
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
@jordanm:是:-exec grep "hello" +
其中一对大括号代表文件名。好建议。【参考方案4】:
递归搜索当前目录:
grep -r 'myString' .
【讨论】:
【参考方案5】:如果我仔细阅读了您的问题,您会要求“grep 在当前目录中搜索包含字符串“hello”的任何和所有文件,并仅显示 .h和 .cc 文件”。因此,为了满足您的精确要求,这是我的提交:
这会显示文件名:
grep -lR hello * | egrep '(cc|h)$'
...这会显示文件名和内容:
grep hello `grep -lR hello * | egrep '(cc|h)$'`
【讨论】:
【参考方案6】:如果您需要递归搜索,您有多种选择。你应该考虑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" +
【参考方案7】:
grep -l hello **/*.h,cc
如果没有 .h 或 .cc 文件,您可能需要shopt -s nullglob
以避免出现错误消息。
【讨论】:
我知道如何使用谷歌等。我在这里问它是因为有几个答案都有“-l”,而且很高兴将所有信息放在一个地方。 -l(小写“el”)抑制正常输出。打印通常会从中打印输出的每个输入文件的名称。扫描/搜索将在第一次匹配时停止。【参考方案8】:最简单的方法:grep -Ril "Your text" /
【讨论】:
这不会只显示 .h 或 .cc 文件,它有助于解释您使用了哪些选项以及原因。以上是关于如何使用 grep 在当前目录中搜索具有字符串“hello”但仅显示 .h 和 .cc 文件的所有文件?的主要内容,如果未能解决你的问题,请参考以下文章