在 Windows 中,如果我想在所有子目录中的所有文件中查找字符串,我会这样做
findstr /C:"the string" /S *.h
find
然而,在 Linux(比如 Ubuntu)中,除了涉及、xargs
、 和 的一些管道命令之外,我没有找到其他方法grep
(示例位于此页面:如何递归地 grep 遍历子目录?)然而,我的问题不同:有没有单个内置命令不需要编写我的 shell 脚本就能通过这个魔法起作用吗?
答案1
GNU grep 允许通过子目录递归搜索:
grep -r --include='*.h' 'the string' .
答案2
grep -r searchpattern /path/to/start/in
其中/path/to/start/in/
可以只是“ .
”表示当前目录。
答案3
不, find -name \*.h -print0 | xargs -0 grep -l 'the regex'
这就是它的魔力。
答案4
有没有单个内置命令通过这个魔法起作用......?
做个迂腐的人,不,你不能假设存在这样的命令。
Unix 有许多不同的实现,每种都有其不同的特点。 POSIX,共同点(也是最接近 Unices 标准的东西)没有指定这样的选项grep
。
正如其他答案中提到的,GNU 的实现grep
有一个非标准选项可以满足您的需求。虽然这种特定的实现在 Linux 系统上可能很常见,但您不能假设它在任何 Unix 上都可用,甚至在某些 Linux 系统上也是如此。
最后,我要提到的是Unix哲学有利于多个原始程序的组合,而不是使用一个试图同时完成所有操作的大型整体可执行文件。
在您的情况下,抓取文件系统和匹配流中的正则表达式是两个独立的任务。在单独的程序中对待每一个都是正常的。