grep 查找文件并打开结果匹配

grep 查找文件并打开结果匹配

我试图根据命令行中 grep 的一些返回值打开所有文件。我知道我可以使用-l仅返回文件名的选项,但我想以某种方式将其与另一系列标志或参数结合起来,以生成所述文件的完整路径。

我尝试过类似的事情:

find . -iname "*.ext" | xargs grep -l "mystring" | xargs open

还有类似的东西:

grep -HR -l mystring . | xargs open

但收效甚微。请注意,我也想递归到所有子目录。我看见这个问题,这并不完全相关。

更新:

我能够得到这样的工作

grep -HR -l mystring . | xargs -L 1 open

问题是,对于很多文件,命令行以两种方式抱怨:

LSOpenURLsWithRole() failed with error -1712 for the file /Users/blah/blah.ext

The files /blah/blah/file.ext do not exist,其中路径中有一个空格。

答案1

如果文件名中有空格,那么您需要使用print0file 选项,稍后-0使用选项xargs,最后-I {}使用第二个选项xargs

find . -iname "*.maxpat" -print0 | xargs -0 grep -l "mystring" | xargs -I '{}' open '{}'

emacs作为命令进行测试open

答案2

-exec获取您放入其中的命令的退出状态并在逻辑上使用它find

所以,像这样简单的事情就应该有效

find . -iname "*.ext" -exec grep -q "mystring" {} \; -exec open {} \;

答案3

我不确定grep您使用的是哪个版本,但如果我正确阅读了手册页grep,那么扫描将在第一次成功匹配后停止。那是你要的吗?我从你的问题中了解到你想“打开所有文件”。

如果您不介意使用vimor gvim,那么您可以使用:

$ grep -n mystring *.ext > /tmp/mystring.list
$ vim -q /tmp/mystring.list

(我从未尝试过组合这两个命令,因为vim不读取quickfix/ errorfilefrom stdin

Vim 将打开第一个文件/tmp/mystring.list并将光标直接放在mystring找到的行上。您可以使用 转到下一个实例:cn,使用 转到上一个实例:cp

如果您不是vim用户,并且由于您说链接的问题对您没有多大帮助,那么find ... -print0应该有所帮助 - 正如已经建议的那样。

答案4

pwd通过查找使用:

find `pwd` -iname *.maxpat | xargs grep -l "mystring" | xargs open

相关内容