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

相關內容