回答:
私はあなたを正しく理解している場合、これはあなたがやりたいことです:
find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt
Find
拡張子を持つすべてのファイルpy
、grep
含まれている行だけsomething
との行を保存しますoutput.txt
。ファイルに何かが含まれている場合は、置き換えられます。
編集:-execを使用:
find . -name '*.py' -exec grep 'something' {} \; > output.txt
ここにクリスダウンズのコメントを取り入れています。上記のコマンドをgrep
実行すると、find
見つかった回数だけ実行されます。しかし、あなたが交換した場合;
には+
、grep
出力と呼ばれているfind
(一定の限度まで)連結。この問題の詳細については、「findでのセミコロン(;)対プラス(+)の使用」の質問を参照してください。
grep -H
出力にファイルのファイル名を含める場合に使用します。
のすべてのファイルで一致するすべての行を保存する場合、コマンドの最後に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"' {} \;
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt
そして、grepされた行の行番号を表示したい場合は、もちろん使用できますgrep -n "something"
使用tee
:
find . -name '*.py' | tee output.txt | xargs grep 'something'
注意点は、あなたが(スペースを含む)特殊文字を含むすべてのファイルを持っている場合であることをxargs
してgrep
(とうまく動作しませんa file.txt
二つのファイルとして解釈、されるa
とfile.txt
)。それに代わるものは、どちらかを使用することである-x
かを-print0
、しかし、それらのいずれかは、あなたを汚染しますoutput.txt
。は、特定の特殊文字をエスケープ-x
するために使用さ\
れ、これはにありoutput.txt
ます。-print0
(また、必要とするフィールドセパレータとしてnullバイトを使用しますxargs -0
)とoutput.txt
テキストの一つの長い連続したラインのようになります。
これにどう対処する(またはしない)かはあなた次第です。
+
代わりに使用すると\;
、実行時間が大幅に改善されます(実行前に引数を連結するためARG_MAX
)。