将 find 的输出发送到 stdout 并通过管道传输到 grep

将 find 的输出发送到 stdout 并通过管道传输到 grep

我有 100 多个 rar 文件,我想使用 findexec命令提取它们。我希望看到通常的 rar 输出,以便我可以监视其进度,并将输出通过管道传输到grep,然后通过wc管道计算“All OK”行(如果成功提取存档,则 rar 会打印该行)。

我使用以下命令(没有最后的wc -l组件)进行了测试,该命令旨在查找 2 个 rar 存档,但仅打印 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

最后一行仅输出 2 wc -l,显示“All OK”的实际匹配数。

这可能吗?谢谢。

编辑 @ 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可以发送到标准输出和文件。在您的示例中,您将两个输出发送到标准输出(在本例中是管道)。解决这个问题的一种方法是使用命名管道来捕获输出:

 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'

相关内容