foo
findで見つけたすべての結果に対して実行したいプログラムがあります。だからこんな感じ:
find . -name '*.o' -type f -exec foo {} \;
foo
特定の文字列バーへのすべての呼び出しの出力を把握したいと思います。だから私はこれを追加します:
find . -name '*.o' -type f -exec foo {} \; | grep bar
しかし、一致がどのファイルから来たのかに関する元の情報を失いました。コマンド -fprintf /dev/stderr '%p\n'
に追加しようとしましたが、grepの結果が印刷されず、stdoutが消えているようです。find
各ファイル名を出力に印刷し、そのファイルに対応するgrep結果を印刷するにはどうすればよいですか?
-H
あるいは、引数を操作する方法があればgrep
良いと思いますが、書かれているように標準入力からテキストを渡し、ファイルgrep
名がわからないので動作しません。私は様々な注文を試しましたが、xargs
何も効果がありませんでした。
ベストアンサー1
各ファイル名を出力に印刷し、そのファイルに対応する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 {} +