findの出力をstdoutに送り、grepにパイプします。

findの出力をstdoutに送り、grepにパイプします。

100を超えるrarファイルがありますが、execfindコマンドを使用して抽出したいと思います。進捗状況を監視し、出力をパイプしてから、パイプを介してgrep" wcAll OK"行(アーカイブが正常に抽出されたらrarが印刷する)を計算できるように、一般的なrar出力を見たいと思います。

2つのrarアーカイブを見つけるように設計された次のコマンド(最後のコンポーネントなし)でテストしwc -lましたが、「all OK」という4行と抽出された2つのrarアーカイブに対してそれぞれ2行だけ印刷します。

$ find -iname 'TestNum*.rar' -execdir rar e '{}' \; | tee - | grep -i 'All OK'
All OK
All OK
All OK
All OK
Note: 2 archives extracted, but 4 'All OK' lines, and none of rar's output.

私が望むのはこれです:

$ find -iname 'TestNum*.rar' -execdir rar e '{}' \; | ... ???
Extracting from TestNum1.rar
All OK
Extracting from TestNum2.rar
All OK
2

最後の行では、wc -l「All OK」の実際の一致数を表示する2つだけを出力します。

可能ですか?ありがとうございます。

編集@ 2018-04-25 19:21

私は次のことを行うことができ、うまく機能することに気づきました。

find . -iname 'TestNum*.rar' -execdir rar e '{}' \; | tee rar_out
grep -i 'All OK' rar_out | wc -l

まだ興味がないので元々は可能でしょうか?

答え1

tee標準出力とファイルに送信できます。あなたの例では、両方の出力を標準出力(この場合はパイプ)に送信します。この問題を解決する1つの方法は、名前付きパイプを使用して出力をキャプチャすることです。

 mkfifo p
 cat p &   # this blocks until something is written to p
 find -iname 'TestNum*.rar' -execdir rar e '{}' \; | tee p | grep -c 'All OK'

関連情報