Envia a saída do find para stdout e canalizada para grep

0

Eu tenho mais de 100 arquivos rar que eu quero extrair usando o comando exec do find. Eu gostaria de ver a saída rar comum para que eu possa monitorar seu progresso, e também canalizar a saída para grep e depois para wc para contar as linhas 'All OK' (que rar imprime se um arquivo é extraído com sucesso).

Eu testei com o seguinte comando (sem o componente wc -l final), que foi projetado para encontrar 2 arquivos rar, mas que simplesmente imprimiram 4 linhas 'All OK', 2 para cada um dos 2 arquivos rar que foram extraídos .

$ 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.

O que eu queria era algo como:

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

A linha final com apenas 2 sendo a saída wc -l , mostrando o número real de correspondências de 'Tudo OK'.

Isso é possível? Obrigado.

EDIT @ 2018-04-25 19:21

Acabei de perceber que eu poderia fazer o seguinte, que funciona bem:

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

Ainda está fora de interesse o que eu pedi originalmente possível?

    
por mattst 25.04.2018 / 19:40

1 resposta

2

tee pode enviar para stdout e para um arquivo. Em seu exemplo, você envia ambas as saídas para stdout (que neste caso é o pipe). Uma maneira de contornar isso é usar um pipe nomeado para capturar a saída:

 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'
    
por 25.04.2018 / 20:45

Tags