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


64

例で説明する方が良い。

私は出来ます:

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

回答:


106

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

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

Find拡張子を持つすべてのファイルpygrep含まれている行だけsomethingとの行を保存しますoutput.txt。ファイルに何かが含まれている場合は、置き換えられます。

編集:-execを使用:

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

ここにクリスダウンズのコメントを取り入れています。上記のコマンドをgrep実行すると、find見つかった回数だけ実行されます。しかし、あなたが交換した場合;には+grep出力と呼ばれているfind(一定の限度まで)連結。この問題の詳細については、「findでのセミコロン(;)対プラス(+)の使用」の質問参照してください。


16
+代わりに使用すると\;、実行時間が大幅に改善されます(実行前に引数を連結するためARG_MAX)。
クリスダウン

これでxargsの威力がわかりました!ありがとう!
ドミ

4
grep -H出力にファイルのファイル名を含める場合に使用します。
シュタイナー

18

のすべてのファイルで一致するすべての行を保存する場合、コマンドの最後に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"' {} \;

最後の1つは本当にいいです:D
bakytn

@gillesの回答を展開してもう少しわかりやすくするために、特に扱っているファイルのリストが大きい場合は、これを使用してgrepの結果とともに各ファイルのファイル名(相対パス)を報告できます。 : find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt そして、grepさ​​れた行の行番号を表示したい場合は、もちろん使用できますgrep -n "something"
JJMpls 14

9

検索対象のファイルをフィルタリングするために使用できるレコード、grephas --include、および--exclude引数:

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

2
少なくともGNU grepはそうです。
phk

2

使用tee

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

注意点は、あなたが(スペースを含む)特殊文字を含むすべてのファイルを持っている場合であることをxargsしてgrep(とうまく動作しませんa file.txt二つのファイルとして解釈、されるafile.txt)。それに代わるものは、どちらかを使用することである-xかを-print0、しかし、それらのいずれかは、あなたを汚染しますoutput.txt。は、特定の特殊文字をエスケープ-xするために使用さ\れ、これはにありoutput.txtます。-print0(また、必要とするフィールドセパレータとしてnullバイトを使用しますxargs -0)とoutput.txtテキストの一つの長い連続したラインのようになります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.