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

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

たとえば、説明するのが最善です。

私はできます:

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

答え1

私が正しく理解したなら、これはあなたが望むものです:

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

その行のみを.py含む拡張子を持つすべてのファイルを検索し、その行を 。ファイルがある場合は切り捨てられない場合は作成されます。grepsomethingoutput.txtoutput.txt

使用-exec:

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

ここにChris Downsのコメントを統合します。上記のコマンドを使用すると、指定されたテスト(上記の単一テストのみ)を通過するパス名を見つけるgrepために複数回実行されます。ただし、に置き換えると、複数のパス名(最大特定の制限)で呼び出されます。find-name\;+grepfind

問題を見るfindとexecでのセミコロン(;)とプラス記号(+)の使用の比較このトピックに関する追加情報。

答え2

のすべてのファイルに一致するすべての行を保存したい場合は、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"' {} \;

答え3

参考までに、GNUには検索ファイルをフィルタリングするために使用できるパラメータがありますgrep--include--exclude

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

答え4

尋ねる:

ただし、出力を同じファイルに保存する方法は次のとおりです。

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

あなたは誤解しました。何も伝えられない理由は完全な命令ではないからです。閉じるステートメントは\シェルに次のコマンドラインを読み続けるように指示しますが、ここではそうしようとしていません。試してみるとき:

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

\追加の引数として渡されるように空白文字をエスケープfindし、そのオプションに渡されたコマンドが終了していないとfind文句を言います。-exec

+コマンドはまたはトークンを追加して終了する必要があり、;この;トークンはシェルに特化しているため、エスケープまたは引用する必要があります。また、{および}はほとんどのシェルで特別なので、エスケープまたは引用する必要があります。

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

または

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

以下は有効なコマンドなので、出力をきれいにリダイレクトしてパイプすることができます。

find . -name "*.py" -type f -exec grep "something" \{} \; > output.txt
find . -name "*.py" -type f -exec grep "something" '{}' + | fgrep -v notthesefiles: > output.txt

ところで、シェルがその中の文字を解釈したくない場合(@Kusalanandaが指摘したように)、この場合は不要であっても一重引用符で囲まれた引数を使用することを好みます。

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

;との違いを+調べるにはman find

関連情報