Grep

find … -exec grep … {} + 結果給出的打開文件的可靠方法

  • September 8, 2020

我經常執行這樣的命令:

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 在quiet 模式下執行:每個文件只使用它的返回值。如果0,則在該文件中找到匹配項並將該文件傳遞給 Vim。

{} \;表示 Grep 一次將分析一個文件。如果我們使用{} +,所有文件都將作為參數傳遞給 Grep,並且在任何這些文件中找到的匹配項都會導致0退出狀態,因此所有這些文件都將在 Vim 中打開。另一方面,{} +用於 Vim,以便每個找到的文件在單個 Vim 程序中轉到一個緩衝區。您可以嘗試更改它們以感受不同。

如果您需要加快速度:

  • 如果'pattern'不是正則表達式,而只是固定模式,則將-F標誌添加到 Grep。
  • grep -lZ, Xargs 和特殊的 shell 結構如果你有可用的也應該加快這個過程,請參閱Stéphane Chazelas 的回答

這是另一個與Xargs、Find 和 Vim 類似的案例。

引用自:https://unix.stackexchange.com/questions/608327