foo
というプログラムがあります findを介して見つかった各結果に対して実行したいと思います。だからこのようなもの:
find . -name '*.o' -type f -exec foo {} ;
foo
のこれらすべての呼び出しの出力をgrepしたい 特定のストリングバーの場合。だから私はこれを追加します:
find . -name '*.o' -type f -exec foo {} ; | grep bar
しかし、一致がどのファイルから来ているかについての元の情報を失います。 -fprintf /dev/stderr '%pn'
を追加してみました find
へ コマンドですが、grepの結果が出力されないため、stdoutがなくなったように見えます。
各ファイル名を出力に出力し、その後、そのファイルに対応するgrep結果を出力するにはどうすればよいですか?
または、-H
を作成する方法があった場合 grep
の引数 動作も問題ありませんが、stdinとgrep
からテキストを渡すだけなので、記述どおりには動作しません。 ファイル名がわかりません。 xargs
のさまざまな呪文を試しました 、しかし私もそれを機能させることができませんでした。
承認された回答:
各ファイル名を出力に出力し、その後にそのファイルに対応するgrep結果を出力するには、-exec foo {} | grep
シェル内のパイプ:
find . -name '*.o' -type f -print -exec sh -c 'foo "$1" | grep "bar"' sh {} ;
-H
を作成するには ご使用のバージョンのgrep
の場合、grepの引数は標準入力で機能します --label=
をサポートします あなたができるオプション
find . -name '*.o' -type f -exec sh -c '
foo "$1" | grep -H --label="$1" "bar"
' sh {} ;
または(検索結果が+
をサポートしている場合 ;
に代わる複数の引数 ):
find . -name '*.o' -type f -exec sh -c '
for f; do foo "$f" | grep -H --label="$f" "bar"; done
' sh {} +