grep 递归文件名匹配 (grep -ir "xyz"*.cpp) 不起作用

标签 grep

尽管
grep -ir "xyz"* 递归搜索目录并告诉我文本存在于 ./x/y/z/abc.cpp
然而 ,
grep -ir "xyz"*.cpp 没有结果。
第二个命令不是应该递归地grep目录中的所有cpp文件吗?
我在这里缺少什么?

最佳答案

Grep 将遍历与您的 glob 模式匹配的任何目录。 (在您的情况下,您可能没有任何与模式“*.cpp”匹配的目录)您可以明确指定它们:grep -ir "xyz" *.cpp */*.cpp */*/*.cpp */*/*/*.cpp等。您还可以使用 --include 选项(请参见下面的示例)
如果您使用的是 GNU grep,则可以使用以下命令:

grep -ir --include "*.cpp" "xyz" .
上面的命令说从当前目录开始递归搜索,忽略模式上的大小写,只搜索匹配全局模式“*.cpp”的文件。
如果你在其他 Unix 平台上,你可以使用这个:
find ./ -type f -name "*.cpp" -print0 | xargs -0 grep -i "xyz"
如果您确定所有文件的名称中都没有空格,则可以省略 -print0要查找的参数和 -0到 xargs
上面的命令说明如下:在当前目录 (./) 下找到与名称 glob/wildcard "*.cpp"(-name "*.cpp") 匹配的所有文件(-type f),然后将它们以分隔符打印出来通过空值(-print0)。找到的文件列表应该写入下一个命令的标准输入:xargs。 xargs 应该从 stdin(默认行为)读取并将其输入拆分为空值 (-0),然后使用该文件列表上的指定选项 (grep -i "xyz") 调用 grep 命令。
如果您有兴趣进一步了解原因 grep -ir "xyz" *.cpp不像您认为的那样工作,您应该搜索“shell globbing”(here 是关于该主题的第一篇很好的文章)。我也会尝试提供一个快速的解释。当您输入命令时 grep -ir "xyz" *.cpp并按回车键,有两个程序参与执行您的命令。第一个程序是你的 shell(除非你做了一些自定义的事情,你可能通常是 bash shell——如果你从未听说过 shell 或 bash,那就是你应该开始寻找的地方,有很多好的文章)。可以说 shell 只是一个程序,旨在让您浏览计算机上的文件系统并运行其他程序。 (在 Windows 中,当您双击图标启动程序,或打开文件夹访问文件时,您运行的程序是 explorer.exe,它是 Windows 图形 shell )。所以,当你输入命令 grep -ir "xyz" *.cpp , 在 grep 运行之前,shell 会处理读取您的命令并执行一些操作。其中一件事就是扩展全局模式(例如 *.txt[0-9]+.pdf )。就像我说的,如果你想了解它,去阅读更多关于它的信息,但你应该带走的是grep命令永远不会看到*.cpp .发生的情况是,shell 在当前目录中查找名称与模式 *.cpp 匹配的任何文件或目录。然后在运行 grep 命令之前在命令行上替换它们。 (如果它没有找到任何匹配的东西,那么它会将 *.cpp 留在那里并且 grep 会看到它,但是 grep 因为通常不进行 glob 匹配,这对你没有任何作用)。
或者,当您输入 grep -ir "xyz" * 时,发生的情况是 shell 替换了 *使用当前目录中每个文件和目录的名称(因为 * 匹配任何内容)。假设您有一个包含 file1、file2 和 dir1 和 dir2 的目录,那么 shell 将执行其替换,然后执行如下所示的命令 grep -ir "xyz" file1 file2 dir1 dir2 ,这意味着 grep 将在 file1 和 file2 中搜索包含字符串 xyz 的行,并且因为 -ir它还通过 dir1 和 dir2 递归搜索并搜索为该字符串找到的任何文件。最后,如果你已经遵循了我到目前为止所说的一切,那么 grep 确实有一种方法可以在递归搜索中使用 glob 模式,那就是使用 --include选项,如我之前描述的命令:grep -ir --include "*.cpp" "xyz" . ,以及为什么我们把 *.cpp该命令中的引号是为了防止 shell 在我们运行该命令之前尝试扩展 glob 模式。

关于grep 递归文件名匹配 (grep -ir "xyz"*.cpp) 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31797488/

相关文章:

shell - 如果找到内容,如何在grep之后生成文件?

linux - Grep 在不使用管道的情况下获取文件中的字符串

linux - 关于 grep 用法和中缀运算符

linux - 如何使用 linux 命令提取 ID 和 key ?

Bash:来自命令输出的 grep 模式

awk - 仅当列条目与上一行的列不匹配时有条件地打印行

Linux : Search for a particular word in all the files

Bash 域的 IP 地址综合列表

ruby - 如何将系统 grep 结果导入 ruby

grep - 使用 grep 过滤 Doxygen 输出