2017-03-10 5 views
0

を-exec使用して、私は基本的に再帰的grepの文ですbashrcに機能RGを、書いた:は、Cygwinのではbashrcに関数からの出力に

rg() { 
    find . -type f -exec grep -il $1 {} \; 
} 

これはうまく動作しますが、今は上に追加のgrepを実行する必要があります各出力行は別の単語をチェックします。私は基本的に両方の単語を含む各ファイルをリストしたい(必ずしも同じ行にあるとは限りません)。私はこのコマンドを試しました:

rg Word1 -exec grep -il Word2 {} \; 

これは単に "Word1"を含む同じファイルを出力するようです。

私はこの次のコマンドを試したところ、 "Ha"を各行に出力したと思っていましたが、 "rg Word1"ステートメントからファイルをリストし続けています。

rg Word1 -exec echo "Ha" \; 

ここで私は明らかに何か間違っています。誰も私の混乱をクリアすることはできますか?私はgrepの中でこれを行う方法があることを知っていますが、それは1行単位で動作するようです。私がやっていることはかなり一般的だと思います。また、私は一度これを働かせて、私は便宜のために別のbashrc関数に入れたいと思います。それがより複雑になるかどうかは分かりません。

+1

あなたは '-exec grep -il Word2 {} \;'を引数として 'rg'に渡しますが、関数内のどこにもそれらを使用していないので、効果はありません –

+0

したがって、 'findを実行する。 '$ 1'としての' '$ 1''は' 'Word1''です。 – 123

+0

"-exec grep"をrgの引数にしない方法がありますか?このような関数でexecを使うことは可能ですか? – Zip184

答えて

1

xargsコマンドは、標準入力からコマンドの引数を収集し、指定されたコマンドを実行します。これを関数rgと組み合わせて、関数の出力をフィルタリングすることができます。例えば、

rg Word1 | xargs grep -il Word2 

標準入力から読み取りxargs引数 - 関数rgによって放射されたファイル名 - 指定されたコマンド(grep -il Word2)に付加され、そして得られたコマンドの実行。 xargsの入力が十分に長い場合、引数はgrepコマンドの複数の呼び出しに分割されます。この場合、出力(この場合)には違いはありませんが、引数が多すぎるためコマンド実行に失敗することはありません。


も実行される別個grepプロセスの数を最小限にするために(すなわちxargsを使用して)同じように機能rgを構成することを検討してください。新しいプロセスの開始は、あなたができるより高価なものの1つです。

関連する問題