grepを使用してファイル名を印刷すると、find -execが発生します。

grepを使用してファイル名を印刷すると、find -execが発生します。

foofindで見つけたすべての結果に対して実行したいプログラムがあります。だからこんな感じ:

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 {} \;

-Hgrepの引数が標準入力と連携するようにするには、バージョンがオプションをサポートしている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 {} +

おすすめ記事