複数のサブディレクトリにある複数のファイルで最後の一致を見つけましたが、ファイルパスも出力したいのですが、それはできません。どのように変更する必要がありますか?
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 {} +
'{}'
(私はそれをシェルスクリプトレットから移動し、位置引数として渡す自由を得ました。)