サブディレクトリから複数のファイルの最後の発生を出力し、各発生のファイルパスを出力する方法

サブディレクトリから複数のファイルの最後の発生を出力し、各発生のファイルパスを出力する方法

複数のサブディレクトリにある複数のファイルで最後の一致を見つけましたが、ファイルパスも出力したいのですが、それはできません。どのように変更する必要がありますか?

find subdirprefix* -name log -exec sh -c "tac '{}' | grep -m1 'search string' " \;

これにより、各ファイルの最後のエントリとファイルパス(フルパスではなく開始ディレクトリに基づく)が出力されます。

つまり、出力は次のようになります。

[..]search string[..] : subdirprefix1/log
[..]search string[..] : subdirprefix2/log
[..]search string[..] : subdirprefix3/log

答え1

少なくともGNU grepを使用すると、-H出力に元のファイル名でタグを付けることができます。入力がstdinを介してパイプされたときに機能させるための秘密は、その--labelオプションを使用することです。

例えば

find subdirprefix* -name log -exec sh -c '
  tac "$1" | grep -H --label="$1" -m1 "search string"
' find-sh {} \;

または(少し効率的)

find subdirprefix* -name log -exec sh -c '
  for f; do tac "$f" | grep -H --label="$f" -m1 "search string"; done
' find-sh {} +

'{}'(私はそれをシェルスクリプトレットから移動し、位置引数として渡す自由を得ました。)

関連情報