たとえば、説明するのが最善です。
私はできます:
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
含む拡張子を持つすべてのファイルを検索し、その行を 。ファイルがある場合は切り捨てられない場合は作成されます。grep
something
output.txt
output.txt
使用-exec
:
find . -name '*.py' -exec grep 'something' {} \; > output.txt
ここにChris Downsのコメントを統合します。上記のコマンドを使用すると、指定されたテスト(上記の単一テストのみ)を通過するパス名を見つけるgrep
ために複数回実行されます。ただし、に置き換えると、複数のパス名(最大特定の制限)で呼び出されます。find
-name
\;
+
grep
find
問題を見る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
。