如何通过正则表达式查找文件

如何通过正则表达式查找文件

我希望在当前目录中所有类型为“*.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

相关内容