아마도 조금 이상 할 수 있습니다.이 작업을 수행 할 수있는 다른 도구가있을 수 있습니다.

다음 클래식 bash 명령을 사용하여 일부 문자열이 포함 된 모든 파일을 찾습니다.

find . -type f | xargs grep "something" 

여러 깊이에 많은 파일이 있습니다. . “something”의 첫 번째 발생으로 충분하지만 find는 계속 검색하고 나머지 파일을 완료하는 데 오랜 시간이 걸립니다. 내가 원하는 것은 grep back의 “feedback”과 같은 것입니다. find는 더 많은 파일 검색을 중지 할 수 있습니다. 그런 일이 가능합니까?

답변

단순히 find 영역 내에 두십시오.

find . -type f -exec grep "something" {} \; -quit 

작동 방식 :

-exec-type f는 true가됩니다. grep0 (성공 / true)를 div id = “70324 b5a47 “>

에 일치하는 항목이 있으면 -quit가 트리거됩니다.

답변

find -type f | xargs grep e | head -1 

정확히 수행합니다. head가 종료되면 파이프의 중간 요소에”깨진 파이프 “신호를 보내고 차례로 종료하고 find에 알립니다. 이를 확인하는

xargs: grep: terminated by signal 13 

와 같은 알림이 표시됩니다.

댓글

  • 설명과 대안을위한 +1, 다른 답변은 더 자급 자족하기 때문에 더 우아하게 보이지만

답변

도구를 변경하지 않고이 작업을 수행하려면 : (xargs를 좋아합니다)

#!/bin/bash find . -type f | # xargs -n20 -P20: use 10 parallel processes to grep files in batches of 20 # grep -m1: show just on match per file # grep --line-buffered: multiple matches from independent grep processes # will not be interleaved xargs -P10 -n20 grep -m1 --line-buffered "$1" 2> >( # Error output (stderr) is redirected to this command. # We ignore this particular error, and send any others back to stderr. grep -v "^xargs: .*: terminated by signal 13$" >&2 ) | # Little known fact: all `head` does is send signal 13 after n lines. head -n 1 

댓글

  • +1은 xargs가 이러한 멀티 태스킹 기능을 가질 것이라는 것을 결코 알지 못했습니다. 다른 의견도 감사드립니다! 🙂

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다