例を説明する方がよい。
次のことができます:
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
拡張子が.py
のすべてのファイルを検索し、grep
はsomething
そして行をoutput.txt
に保存します。output.txt
ファイルが存在する場合は切り捨てられ、そうでない場合は切り捨てられます。作成されます。
-exec
の使用:
find . -name "*.py" -exec grep "something" {} \; > output.txt
ChrisDownsを組み込んでいますここにコメント:上記のコマンドを実行すると、find
が指定されたテストに合格するパス名を検出する回数だけgrep
が実行されます(単一のテストのみ) 上記のテスト)。ただし、\;
を+
に置き換えると、grep
が複数のパス名で呼び出されます。 find
から(特定の制限まで)。
質問セミコロン(;)とプラス( +)件名の詳細については、検索でexecを使用します。
コメント
は、複数のファイルをgrepに渡し、そのセット内のファイルにテキスト'何か'、これらのファイルはすべてテストに合格します。そのため、'やりたいことができません。
回答
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
- @gillesの回答を拡張して、もう少し有益なものにするために、特にファイルのリストが'処理が大きい場合は、次のコマンドを使用して、各ファイルのファイル名(相対パス)をgrep 'の結果とともに報告できます。
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt
そして' e grep ' ed行の行番号は、もちろんgrep -n "something"
回答
記録として、grep
には--include
があります。検索するファイルをフィルタリングするために使用できる--exclude
引数:
grep -r --include="*.py" "something" > output.txt
コメント
- 少なくともGNU
grep
はそうです。
回答
tee
を使用します:
find . -name "*.py" | tee output.txt | xargs grep "something"
注意点は、ファイルがある場合です。 xargs
およびgrep
ではうまく機能しない特殊文字(スペースを含む)を使用する(a file.txt
は、a
とfile.txt
の2つのファイルとして解釈されます。これに代わる方法は、-x
または-print0
のいずれかを使用することですが、どちらもoutput.txt
。 -x
は\
を使用して特定の特殊文字をエスケープし、これはoutput.txt
にあります。-print0
は、フィールド区切り文字としてnullバイト(xargs -0
も必要)およびoutput.txt
は1行の長い連続したテキストのように見えます。
これにどのように対処するか(またはしないか)はあなた次第です。
回答
grep -n CThread "`find . -name "*.cpp"`"
+
を使用します。\;
の代わりにdiv>を使用すると、実行時間が大幅に改善されます(ARG_MAX
まで実行前に引数が連続するため)。grep -H
を使用します。LC_ALL=C
xargs
の直前で、多くの追加速度を取得します。また、xargs
の-P6
フラグを使用して、(この場合は)6つのプロセスと並行して実行できます(番号は自由に変更してください)。 6からそれより高いまたは低いものに変更して、マシンと検索で'が高速であることを確認します)。参照: unix.stackexchange.com/questions/131535/ …\;
の代わりにid = “dd83a7ad33″>