如何使用 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".

查看findxargs 的手册页了解详细信息。

【讨论】:

您必须在'*.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 findxargs

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

这可能会选择一些您不想要的名称,因为模式匹配更模糊(但更简单),但在其他方面也有效。它适用于findxargs 的非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 文件的所有文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel中搜索具有数组属性的对象数组

在所有表中搜索具有给定值或名称的字段[重复]

在所有表中搜索具有给定值或名称的字段[重复]

如何在URL中搜索具有特定类别的项目

如何在 Visual Studio Code 中搜索具有特定扩展名且包含特定文本的文件

在对象数组中搜索具有特定值的特定键