![为什么这个在所有子目录中搜索字符串的 grep 不起作用?](https://linux22.com/image/886380/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%99%E4%B8%AA%E5%9C%A8%E6%89%80%E6%9C%89%E5%AD%90%E7%9B%AE%E5%BD%95%E4%B8%AD%E6%90%9C%E7%B4%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%20grep%20%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
这是我正在尝试运行的命令。
grep -r "printf" *.c
我正在尝试从 cwd 中存在的所有文件获取所有 printf 行.c
。截至目前,我的当前目录是 Desktop,并且.c
Desktop 下的子目录中至少有 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
(因此适用于任何命令,如wc
、cp
或tar
,而不仅仅是grep
):
年代et(打开)什艾尔选择使用globstar
命令
shopt -s globstar
这将导致**
文件名组件表示此处及下方的所有内容。因此,如果您在 中Desktop
,则**
表示Desktop
目录 中的所有内容及其子目录.然后你可以使用
grep "printf" **/*.c
搜索.c
中及 下的所有文件Desktop
。您不需要指定-r
,因为 shell 会为您执行递归,并且您不需要指定--include
,因为路径名扩展模式(又称 glob 或通配符)包含*.c
。
你可以你nset 选项与shopt -u
。