跨多个目录进行 Grep 查询

跨多个目录进行 Grep 查询

我想运行这个:

grep -r zlib *.cpp

但除非当前目录中有 .cpp 文件(在这种情况下仅搜索它),否则此操作会失败:

 grep: *.cpp: No such file or directory

现在:

grep -r zlib *

搜索整个层次结构,但我想将搜索限制为(例如).cpp 文件。

浏览了人和很多食谱网站,但找不到我认为是一个简单查询的答案 - 所以提前道歉。

答案1

它与 无关grep,但与您当前的 shell 有关。在运行命令之前, shell 会扩展*.cpp到当前目录中的所有 cpp 文件名grep。由于它找不到任何文件名,因此*.cppshell 不会展开该 glob。该grep命令尝试查看这是一个文件,但发现它不是一个真正的文件。

你有几个选择,使用find

find . -type f -name "*.cpp" -exec grep -r zlib {} +

或者,如果您使用的是bashshell,请设置 nullglob 选项以停止返回未扩展的 glob 作为有效结果。目的(..)是使扩展 shell 选项成为临时的,而不是使其永久保留在 shell 中。拥有该--include=*.cpp选项的原因是,通过设置该选项,如果全局扩展失败,则*.cpp变为空,并且您的命令将变为grep -r zlib,这意味着在下面的整个子目录中进行搜索。

( shopt -s nullglob; grep -r --include=*.cpp zlib . ; )

另一种变体不包含--include选项grep,但使用globstar允许在子目录中递归全局扩展的选项

( shopt -s nullglob globstar; grep -rH zlib **/*.cpp  ; )

请记住--include=-H是 GNU grep 选项,与 POSIX 不兼容

答案2

zsh shell 用户会很快指出他们有一个内置的通配符语法,可以通过使用双星号自然地实现这一点:

grep -r zlib **/*.cpp

如果您愿意,只需运行“zsh”即可一次性运行“zsh”,而不必永久切换到它。

相关内容