find의 출력을 stdout으로 보내고 grep으로 파이프합니다.

find의 출력을 stdout으로 보내고 grep으로 파이프합니다.

100개가 넘는 rar 파일이 있는데 execfind 명령을 사용하여 추출하고 싶습니다. 진행 상황을 모니터링하고 출력을 파이프 grep한 다음 wc파이프를 통해 "All 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표준 출력 및 파일로 보낼 수 있습니다. 귀하의 예에서는 두 출력을 모두 표준 출력(이 경우 파이프)으로 보냅니다. 이 문제를 해결하는 한 가지 방법은 명명된 파이프를 사용하여 출력을 캡처하는 것입니다.

 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'

관련 정보