私はしばしば次のコマンドを実行します。
find … -exec grep … --color=always -l {} \+
時にはVimで一致するファイルを開く必要があります。
しかし、最も確実な方法は何ですか?
一方通行そんな気がする
vim $(find … -exec grep … {} \+)
もう一つのアプローチはxargs
。
これら2つの方法と異なる方法について知る必要がある長所/短所/問題がありますか?
ベストアンサー1
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 が一度に 1 つのファイルを分析することを示します。{} +
すべてのファイルはGrepに引数として渡され、次を使用すると一致するものが見つかります。どのこれらのファイル数に応じて0
シャットダウン状態が発生するため、すべてのファイルが Vim で開きます。一方{} +
、Vimの場合、見つかった各ファイルは単一のVimプロセスのバッファに保存されます。変化を感じるために変化を試すことができます。
作業速度を上げる必要がある場合:
'pattern'
正規表現ではなく固定パターンの場合は、Grap-F
にフラグを追加してください。grep -lZ
、Xargs、および特別なシェル構成もプロセスを高速化する必要があります。Stefan Chazerasの答え。
そしてここXargs、Find、Vimのもう1つの類似したユースケースです。