2016-12-30 1 views
7

10 만 개가 넘는 파일이있는 디렉토리가 있습니다. 문자열 "str1"이이 파일의 내용의 일부로 존재하는지 알고 싶습니다.grep - 읽는 파일의 수 제한

명령 : grep -l 'str1' *은 모든 파일을 읽는 데 너무 오래 걸립니다.

grep과 일치하는 파일을 더 이상 읽을 수 없으면 어떻게해야합니까? 라이너 하나?

참고 : 나는 grep -l 'str1' * | head을 시도했지만 이전 명령과 동일한 시간이 걸립니다.

+0

파일 수가 적은 디렉토리에서 명령이 작동합니까? –

+0

아마, 이미 여기에 답변 : http://stackoverflow.com/questions/14093452/grep-only-the-first-match-and-stop –

+0

'head -1'은 트릭을 할 것입니다 –

답변

5

명령 인수에 100,000 개의 파일 이름을 지정하면 문제가 발생할 것입니다. 쉘 명령 행 크기를 초과 할 가능성이 있습니다.

그러나 당신은 당신이 파일 (현재 디렉토리에있는 파일을 검색 할 경우 . 인)에있는 디렉토리의 이름 만에 재귀 옵션을 사용하는 경우 모든 파일의 이름을 필요가 없습니다 :

grep -l -r 'str1' . | head -1 
+0

'-r'이 표준이 아니라는 점을 제외하면 ... –

+0

약간의 외침으로'LC_ALL = "C"grep -m1 -l -r 'str1'을 던집니다. | head -1' – bishop

+2

@gniourf_gniourf, OP 질문에 [tag : linux]라는 태그가 붙어 있으므로 GNU grep을 사용한다고 가정하는 것이 안전하다고 생각합니다. –

3

을 사용하면 파일에서 첫 번째 일치 항목을 찾은 후 grep이 중지됩니다. 대형 텍스트 파일의 경우 매우 효율적입니다.

grep -m 1 str1 * /dev/null | head -1 

위의/dev/null은 하나의 파일이있는 경우 grep이 출력에서 ​​파일 이름을 출력하도록합니다.

어떤 파일의 첫 경기를 찾은 후 중지하려면 :

for file in *; do 
    if grep -q -m 1 str1 "$file"; then 
    echo "$file" 
    break 
    fi 
done 

for 루프는 또한 too many arguments 문제에서 당신을 저장하면 많은 수의 파일과 디렉토리가있을 때.

+0

아주 좋습니다. 나는 하나의 라이너를 찾기를 희망했지만,이 진술들은 그렇게 할 것입니다. – user2070775

+1

OP는 이미'-l'을 사용하고 있습니다. 그러면'grep'이 처음으로 일치 한 후에 멈 춥니 다. –

+1

'for file in'*은 "너무 많은 인수"를 겪지 않으므로이 문제를 해결할 수 있습니다. 예를 들어 http://www.in-ulm.de/~mascheck/various/argmax/ –