web-dev-qa-db-ja.com

-EXECを使用してFINDの結果をgrepし、それでもファイルに出力するにはどうすればよいですか?

例について説明するのが良いでしょう。

できます:

find . -name "*.py" -type f > output.txt

しかし、出力を同じファイルに保存するにはどうすればよいですか?

find . -name "*.py" -type f -exec grep "something" {} \

ただできない

find . -name "*.py" -type f -exec grep "something" {} \ > output.txt
75
bakytn

私があなたを正しく理解しているなら、これはあなたがしたいことです:

find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt

Find拡張子がpyのすべてのファイル、grepsomethingを含む行のみoutput.txtに保存します。ファイルに何かが含まれている場合は、置き換えられます。

編集:-execを使用:

find . -name '*.py' -exec grep 'something' {} \; > output.txt

ここにChris Downsのコメントを組み込んでいます。上記のコマンドを実行すると、grepfindで見つかった回数だけ実行されます。ただし、;+で置き換えると、grepからの出力を連結して(特定の制限まで)findが呼び出されます。件名の詳細については、質問 セミコロン(;)とプラス(+)をexecで使用 を参照してください。

119
johnny

output.txtのすべてのファイルで一致するすべての行を保存する場合、最後のコマンドは機能しますが、コマンドの最後に必要な;がないことを除きます。

find . -name "*.py" -type f -exec grep "something" {} \; > output.txt

grepを実行するたびに異なるファイルに出力を生成する場合は、シェルを実行して出力ファイル名を計算し、リダイレクトを実行します。

find . -name "*.py" -type f -exec sh -c 'grep "something" <"$0" >"$0.txt"' {} \;

レコードの場合、grepには--includeおよび--exclude検索するファイルのフィルタリングに使用できる引数:

grep -r --include="*.py" "something" > output.txt
10
hunse

teeを使用:

find . -name '*.py' | tee output.txt | xargs grep 'something'

注意事項は、xargsおよびgrepが(a file.txtは2つのファイルとして解釈されるaおよびfile.txt)。代わりに-xまたは-print0を使用することもできますが、どちらかがoutput.txtを汚染します。 -x\を使用して特定の特殊文字をエスケープし、これはoutput.txtに含まれます。 -print0はNULLバイトをフィールド区切り文字として使用し(xargs -0も必要)、output.txtは1つの長い連続したテキストのように見えます。

これにどう対処するか(または対処しないか)はあなた次第です。

2
bahamat
grep -n CThread '`find . -name "*.cpp"`'
1
turningeagle