grep 进行递归搜索时打印相对文件路径

grep 进行递归搜索时打印相对文件路径

我试图找出该项目依赖于哪个版本的休眠(这与我的问题正交)。

我们有一个包含多个子项目的父项目,我知道这是在一个或多个pom.xml.问题是,当它打印匹配时,它告诉我的是该行并且它是在 中找到的pom.xml,我想知道哪个子项目pom.xml

我怎样才能grep打印相对路径(绝对路径也可以,但不太漂亮)?如果不可能,欢迎提出替代建议。

$ grep -rI -3 org.hibernate pom.xml

答案1

我建议结合使用 find、xargs 和 grep:

 cd top-dir
 find . -print -name 'pom.xml' -print0 | xargs -0 grep -l pattern

我放入 -print0 / -0 选项,以便找到的目录中的特殊字符受到保护并正确处理。

上面将列出相对于与模式匹配的顶级目录的文件名。

答案2

grep --with-filename -rI -3 org.hibernate pom.xml

从手册页:

       -H, --with-filename
          Print  the  file  name for each match.  This is the default when there is more than one file to
          search.

答案3

另一种解决方案是使用globstar模式,即递归全局,与grep -H在输出中包含文件名的选项结合使用。

shopt -s globstar
grep -H org.hibernate **/pom.xml

与递归grep( -R) 不同,使用此方法时,该-H选项在输出中包含文件路径。

提示:您可能会发现添加shopt -s globstar到您的.bashrc以永久允许递归通配符很有用。

答案4

只需使用以下命令:

cat */demo.txt | grep -Rli 'demo'

该命令将返回文件的路径。

相关内容