여러 파일에서 첫 번째 일치 항목을 찾는 방법

여러 파일에서 첫 번째 일치 항목을 찾는 방법

find 명령이 문자열이나 패턴의 첫 번째 발생 또는 발생을 검색하도록 하는 방법이 있습니까?각각 내에서파일이 여러 개인가요? 나는 일반적인 구문을 사용했습니다.

 find dir -iname '*.ext' -exec command 'pattern' {} \;

(저는 우연히 PDF를 검색하고 있지만 -exec pdfgrep이는 일반적인 질문의 특별한 경우이므로 나중에 또는 별도로 다루어질 수 있다고 가정합니다.)

-quit이는 첫 번째 결과를 생성하기 위해 find 및 or를 사용하여 검색하는 일반적인 문제와는 다르다는 점을 명심하십시오 head -n 1.

답변1

(예제에서) 한 번 일치한 후 파일 읽기를 중지하려면 -mGNU 옵션을 사용하세요 .grep

find dir -iname '*.ext' -exec grep -m 1  'pattern' {} \;

답변2

awk 스크립트를 사용하여 이 작업을 수행할 수 있습니다.

find dir -iname '*.ext' -exec awk '/pattern/{print;exit}' {} \;

답변3

첫 번째 일치 후 검색 명령이 중지되지 않으면 해당 결과를 필터링하고 첫 번째 출력 라인만 유지할 수 있습니다: command 'pattern' /path/to/file | head -n 1. 명령은 종료 시 SIGPIPE 신호를 수신하므로 head버퍼링으로 인해 더 많은 일치 항목을 계속 찾을 수 있지만 일치 항목이 많으면 파일이 끝나기 전에 중지됩니다.

(파이프를 설정하려면) 쉘 명령을 실행해야 하므로 sh에서 호출 해야 합니다 find. 따옴표에 유의하세요. 셸에는 따옴표 레이어가 필요하고 로 시작하는 셸에는 따옴표 레이어가 필요합니다 find. 내부 쉘 명령 주위에 작은 따옴표를 넣고 해킹을 사용하여 작은 따옴표 내에서 작업할 수 있습니다 '\''(작은 따옴표 리터럴 종료, \'리터럴에 대한 작은 따옴표, 동시에 새로운 작은 따옴표 리터럴 시작). 패턴에 다른 것이 필요하지 않습니다(패턴에 'a로 표시되는 a가 포함되어 있지 않은 '\''경우 이 작업을 수행해야 함 '\'\\\'\'').

find dir -iname '*.ext' -exec sh -c 'command '\''pattern'\'' "$0" | head -n 1' {} \;

패턴을 인용하는 것에 대해 걱정하지 않고 외부에 배치하고 매개변수로 전달할 수 있습니다.

find dir -iname '*.ext' -exec sh -c 'command "$0" "$1" | head -n 1' 'pattern' {} \;

쉘을 호출하고 파일을 반복하는 것이 약간 더 빠릅니다.

find dir -iname '*.ext' -exec sh -c '
    for f; do command "$0" "$f" | head -n 1; done
' 'pattern' {} +

관련 정보