例を説明する方がよい。

次のことができます:

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のすべてのファイルを検索し、grepsomethingそして行をoutput.txtに保存します。output.txtファイルが存在する場合は切り捨てられ、そうでない場合は切り捨てられます。作成されます。

-execの使用:

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

ChrisDownsを組み込んでいますここにコメント:上記のコマンドを実行すると、findが指定されたテストに合格するパス名を検出する回数だけgrepが実行されます(単一のテストのみ) 上記のテスト)。ただし、\;+に置き換えると、grepが複数のパス名で呼び出されます。 findから(特定の制限まで)。

質問セミコロン(;)とプラス( +)件名の詳細については、検索でexecを使用します。

コメント

  • +\;の代わりにdiv>を使用すると、実行時間が大幅に改善されます(ARG_MAXまで実行前に引数が連続するため)。
  • xargsの力がわかりました!ありがとうございます!
  • ファイルのファイル名を出力に含める場合は、grep -Hを使用します。
  • オプション1を使用し、LC_ALL=C xargsの直前で、多くの追加速度を取得します。また、xargs-P6フラグを使用して、(この場合は)6つのプロセスと並行して実行できます(番号は自由に変更してください)。 6からそれより高いまたは低いものに変更して、マシンと検索で'が高速であることを確認します)。参照: unix.stackexchange.com/questions/131535/ …
  • ivの使用\;の代わりにid = “dd83a7ad33″>

は、複数のファイルを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は、afile.txtの2つのファイルとして解釈されます。これに代わる方法は、-xまたは-print0のいずれかを使用することですが、どちらもoutput.txt-x\を使用して特定の特殊文字をエスケープし、これはoutput.txtにあります。-print0は、フィールド区切り文字としてnullバイト(xargs -0も必要)およびoutput.txtは1行の長い連続したテキストのように見えます。

これにどのように対処するか(またはしないか)はあなた次第です。

回答

grep -n CThread "`find . -name "*.cpp"`" 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です