Grep
find … -exec grep … {} + 結果給出的打開文件的可靠方法
我經常執行這樣的命令:
find … -exec grep … --color=always -l {} \+
有時我需要在 Vim 中打開匹配的文件。
但是最可靠的方法是什麼?
一種方法似乎是
vim $(find … -exec grep … {} \+)
另一種方法似乎是利用
xargs
.這兩種方法以及其他方法(如果有的話)是否有需要注意的優點/缺點/問題?
vim $(find path/ -exec grep -l 'pattern' {} +)
是一個不帶引號的命令替換,因此將在其結果上的空格上執行分詞,以及路徑名擴展。即,如果一個文件
a b
匹配,Vim 將錯誤地打開a
並且b
. 如果一個文件*
匹配,唉,那將被擴展到相應目錄中的每個文件。一個合適的解決方案是find path/ -type f -exec grep -q 'pattern' {} \; -exec vim {} +
Grep 在
q
uiet 模式下執行:每個文件只使用它的返回值。如果0
,則在該文件中找到匹配項並將該文件傳遞給 Vim。
{} \;
表示 Grep 一次將分析一個文件。如果我們使用{} +
,所有文件都將作為參數傳遞給 Grep,並且在任何這些文件中找到的匹配項都會導致0
退出狀態,因此所有這些文件都將在 Vim 中打開。另一方面,{} +
用於 Vim,以便每個找到的文件在單個 Vim 程序中轉到一個緩衝區。您可以嘗試更改它們以感受不同。如果您需要加快速度:
- 如果
'pattern'
不是正則表達式,而只是固定模式,則將-F
標誌添加到 Grep。grep -lZ
, Xargs 和特殊的 shell 結構如果你有可用的也應該加快這個過程,請參閱Stéphane Chazelas 的回答。這是另一個與Xargs、Find 和 Vim 類似的案例。