例について説明するのが良いでしょう。
できます:
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
私があなたを正しく理解しているなら、これはあなたがしたいことです:
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
ここにChris Downsのコメントを組み込んでいます。上記のコマンドを実行すると、grep
がfind
で見つかった回数だけ実行されます。ただし、;
を+
で置き換えると、grep
からの出力を連結して(特定の制限まで)find
が呼び出されます。件名の詳細については、質問 セミコロン(;)とプラス(+)をexecで使用 を参照してください。
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
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つの長い連続したテキストのように見えます。
これにどう対処するか(または対処しないか)はあなた次第です。
grep -n CThread '`find . -name "*.cpp"`'