我希望在当前目录中所有类型为“*.spec.in”的文件中递归搜索关键字“test”,但这不起作用:
grep -rn "test" ./*.spec.in
我该怎么做呢?
答案1
如果你仔细想想,你就会发现这是行不通的。-r 标志意味着 grep 将期望目录作为其文件源,但你的 glob 将匹配文件(或不匹配任何文件)。这是不匹配。
您可以通过几种方式来实现这一点。
适用于任何 UNIX(实际上是任何 shell)的“教科书”方法是分离责任。使用find
进行递归,并单独执行 grep。让我们找到所有匹配的文件,并将它们交给 grep
find . -type f -name '*.spec.in' | xargs grep -n "test"
从这里开始查找名称与 '*.spec.in' 匹配的文件,将该流传递给 xargs,它会将流转换为 grep 的命令行参数。
如果文件名中没有空格,那么这样做没有问题。但如果有空格,或者您使用它来更改磁盘,那么您可能希望它更紧密一些。有些黑客会弄乱文件名,从而损害磁盘上的重要文件,因此您需要非常小心文件名黑客。出于安全考虑,或者为了避免名称中的空格,您可以告诉 find 和 xargs 进行更紧密的通信。请参阅-print0
下文-0
。
find . -type f -name '*.spec.in' -print0 | xargs -0 something_destructive_like_rm
在较新的 shell 上,例如 zsh 或较新版本的 bash,您可以使用递归 glob,它使用特殊的 ** 语法。它们将递归匹配文件模式。
shopt -s globstar # needed for bash, not for zsh
grep "test" ./**/*.spec.in