我想运行这个:
grep -r zlib *.cpp
但除非当前目录中有 .cpp 文件(在这种情况下仅搜索它),否则此操作会失败:
grep: *.cpp: No such file or directory
现在:
grep -r zlib *
搜索整个层次结构,但我想将搜索限制为(例如).cpp 文件。
浏览了人和很多食谱网站,但找不到我认为是一个简单查询的答案 - 所以提前道歉。
答案1
它与 无关grep
,但与您当前的 shell 有关。在运行命令之前, shell 会扩展*.cpp
到当前目录中的所有 cpp 文件名grep
。由于它找不到任何文件名,因此*.cpp
shell 不会展开该 glob。该grep
命令尝试查看这是一个文件,但发现它不是一个真正的文件。
你有几个选择,使用find
find . -type f -name "*.cpp" -exec grep -r zlib {} +
或者,如果您使用的是bash
shell,请设置 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”,而不必永久切换到它。