bash find xargs grep은 한 번만 나타납니다.

bash find xargs grep은 한 번만 나타납니다.

어쩌면 이것은 약간 이상할 수도 있습니다. 아마도 이 작업을 수행하는 다른 도구가 있을 수도 있지만, 뭐...

특정 문자열이 포함된 모든 파일을 찾으려면 다음과 같은 기본 bash 명령을 사용합니다.

find . -type f | xargs grep "something"

다양한 깊이의 파일이 많이 있습니다. "무언가"가 처음 나타나는 것만으로도 충분하지만 find는 계속 검색하고 나머지 파일을 완료하는 데 오랜 시간이 걸립니다. 내가 원하는 것은 grep에서 find의 "피드백"을 반환하여 find가 더 많은 파일 검색을 중지하도록 하는 것입니다. 그런 일이 가능합니까?

답변1

찾기 범위에 보관하십시오.

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

작동 방식은 다음과 같습니다.

-exec그것이 실현 되면 -type fWill이 작동합니다 . 그리고 일치하면 (success/true) grep를 반환 하므로 0트리거됩니다.-exec grep "something"-quit

답변2

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

이것이 정확히 하는 일: head종료되면 파이프라인의 중간 요소에 "깨진 파이프" 신호가 통보되고, 이는 다시 종료되고 다음과 find같은 알림이 표시됩니다.

xargs: grep: terminated by signal 13

이것은 그것을 확인합니다.

답변3

도구를 변경하지 않고 이를 수행하려면: (저는 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

관련 정보