为什么这个在所有子目录中搜索字符串的 grep 不起作用?

为什么这个在所有子目录中搜索字符串的 grep 不起作用?

这是我正在尝试运行的命令。

grep -r "printf" *.c

我正在尝试从 cwd 中存在的所有文件获取所有 printf 行.c。截至目前,我的当前目录是 Desktop,并且.cDesktop 下的子目录中至少有 10-15 个文件,但此命令根本没有显示任何匹配项。那么在这种情况下我该如何实现呢?

答案1

如果你这样做:

grep -r "printf" *.c

shell 将扩展*.c到当前目录中以 结尾的所有文件/目录.c,如果不存在这样的文件/目录,则模式将按字面意思处理(大概您没有nullglob设置)。

正如您所看到的,您当前的模式永远不会进入当前目录,因为当前目录中没有任何.c文件,或者如果有,它们也没有printf,从而导致输出为空。

您需要使用--include它仅在选择性文件中进行搜索,并且还-r需要递归遍历:

grep -r --include="*.c" "printf" .

上述命令将从当前目录开始递归地在所有.c文件中搜索字符串 (pattern) 。printf

如果你想跟踪所有的符号链接:

grep -R --include="*.c" "printf" .

答案2

如果你想知道为什么你的命令不起作用,请参阅另一个答案如果你想知道如何让它工作,这里有另一种方法(复制自 在目录下具有特定扩展名的文件中查找 使用 的功能( 带有装饰性的本地化)bash 而不是 的功能grep (因此适用于任何命令,如wccptar,而不仅仅是grep):

年代et(打开)艾尔选择使用globstar命令

shopt -s globstar

这将导致**文件名组件表示此处及下方的所有内容。因此,如果您在 中Desktop,则**表示Desktop目录 中的所有内容及其子目录.然后你可以使用

grep "printf" **/*.c

搜索.c中及 下的所有文件Desktop。您不需要指定-r,因为 shell 会为您执行递归,并且您不需要指定--include,因为路径名扩展模式(又称 glob 或通配符)包含*.c


你可以nset 选项与shopt -u

相关内容