재귀 grep : 특정 디렉토리 제외 있으므로 –incldue를 사용하여 확장을 제한 /

재귀 grep을 많이 사용하여 특정 내용의 소스 파일을 찾습니다.

grep -Rni "myfunc" .

큰 코드베이스에서는 이것이 느려질 수 있으므로 –incldue를 사용하여 확장을 제한 / 허용합니다.

grep -Rni --include=*.java "myfunc" .

그러나 전체 하위 디렉토리를 제외 (제거)하는 것이 더 효율적이라고 생각합니다.

grep -Rni --exclude=/.svn/ "myfunc" .

그러나 –exclude는 * .java와 같은 파일 패턴 만 지원합니다. 디렉토리를 제외하려면 어떻게해야합니까?



답변

당신은 ack를 볼 수 있습니다 .

방금 사용하기 시작했지만 이것에 적합합니다.


답변

grep -r --exclude-dir=dev --exclude-dir=sys --exclude-dir=proc PATTERN data

출처 :
https://stackoverflow.com/questions/2799246/grep-clude-a-specific-folder-using


답변

대신 find를 사용할 수 있습니다.

find . -not -path "*/.svn*" -not -type d -exec grep -ni "myfunc" {} \; -print

좋아, 그래서 조금 뒤로, grep 결과를 먼저 얻은 다음 경로 를 얻습니다 . 어쩌면 다른 누군가가 더 나은 대답을 가지고 있습니까?


답변

여기 내 프로젝트 중 하나의 스크립트에서 도움이 될만한 전체 예제가 있습니다.이 파일을 “all_source”(실행 파일로 표시)라고 부르고 프로젝트의 루트 디렉토리에 넣은 다음 grep myfunc $(./all_source)스크립트의 끝에서 정렬 하는 것처럼 완전히 호출합니다. 선택 과목.

#!/bin/bash

find . \
    -type d \( \
            -wholename './lib' -o \
            -wholename './vc6' -o \
            -name 'gen' -o \
            -name '.svn' \
            \) -prune -o \
    -type f \( \
            -name '*.h' -o \
            -name '*.cpp' -o \
            -name '*.c' -o \
            -name '*.lua' -o \
            -name '*.*awk' \) -print \
    | sort

이 스크립트는 프로젝트 일치하는 모든 파일 이름을 반환 *.h, *.cpp, *.c, *.lua, *.*awk하지만, 모든을 .svn라는 이름의 폴더와 세대 폴더에서 검색뿐만 아니라에 대한 폴더를 건너 뛰는하지 않습니다 ./lib./vc6(만 사람 바로 프로젝트 루트 오프). 그래서 당신이 grep myfunc $(./all_source)그것을 할 때 그 파일들만 잡습니다. 프로젝트의 루트 디렉토리에서도 이것을 호출해야합니다.


답변

찾을 수있는 -prune 옵션도 있습니다 :

 find . -path "*/.svn*" -prune -o -not -type d -exec grep -ni "myfunc" {} \; -print

답변

당신은 이것을 시도 할 수 있습니다 :

grep -R  "myfunc" . | grep -v path_to_exclude/

예 : 로그 파일에서 컨텐츠를 검색하지 않으려면 다음을 수행하십시오.

grep -R "myfunc" . | grep -v log/