我试图根据命令行中 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
如果文件名中有空格,那么您需要使用print0
file 选项,稍后-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
,那么扫描将在第一次成功匹配后停止。那是你要的吗?我从你的问题中了解到你想“打开所有文件”。
如果您不介意使用vim
or gvim
,那么您可以使用:
$ grep -n mystring *.ext > /tmp/mystring.list
$ vim -q /tmp/mystring.list
(我从未尝试过组合这两个命令,因为vim
不读取quickfix
/ errorfile
from stdin
)
Vim 将打开第一个文件/tmp/mystring.list
并将光标直接放在mystring
找到的行上。您可以使用 转到下一个实例:cn
,使用 转到上一个实例:cp
。
如果您不是vim
用户,并且由于您说链接的问题对您没有多大帮助,那么find ... -print0
应该有所帮助 - 正如已经建议的那样。
答案4
pwd
通过查找使用:
find `pwd` -iname *.maxpat | xargs grep -l "mystring" | xargs open