
我試圖根據命令行中 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