재귀 적으로 폴더를 검색하지만 svn 하위 폴더는 제외 싶지만 .svn디렉토리에 포함 된 항목과 일치하지

fooSVN이 유지 관리하는 대형 파일 시스템에서 발생하는 모든 항목을 찾고 싶지만 .svn디렉토리에 포함 된 항목과 일치하지 않습니다 .

내가 할 때 즉시 일치 grep -l -e 'foo' *하지만 grep -l -e 'foo' --exclude-dir=".svn"명령을 사용 하여 svn 디렉토리를 제외하고 제외하면 그냥 멈 춥니 다.

내가 무엇을 잘못하고 있지?



답변

--exclude-dir명령 행에 파일을 나열 할 필요가 없습니다. grep표준 입력을 기다리고 있기 때문에 “매달려” 있습니다.

grep -l -e 'foo'--exclude-dir = ". svn" *

기본적으로 ack을 사용하여 .svn유사한 폴더 를 제외 하고 다른 많은 기능을 가지고 있습니다.


답변

ack에 관심이있을 수 있습니다 . 재귀 검색 (및 기타 grep 유사 작업)을 수행 하며 기본적 으로 .svn 또는 .git 와 같은 디렉토리는 제외합니다 .


답변

grep --exclude-dir...솔루션은 잘해야하지만, 또 다른 방법을 보여주기 위해, 당신은이 작업을 수행 할 수 find-prune:

find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +

더 많은 것을 실행하려면 find평범한 것보다 낫습니다 grep -r.

find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;

답변

당신은 같은 디렉토리에 grep을하지 않으려면 .svn 지금 당신이 설정할 수 $GREP_OPTIONS아래로 제외 할 변수를 :

export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"

이 줄을 당신에게 추가하면 .bashrc재귀 그렙은 더 이상 .svn디렉토리에 들어 가지 않습니다 . 물론 원하는만큼 풍부 할 수 있습니다.

export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"

답변

awk 솔루션도 있습니다.

find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}'

기본적으로 모든 파일에서 /.svn/와 일치하는 파일을 정리 한 다음 / foo /와 일치하는 파일 만 인쇄합니다. ls로 결과를 쉽게 사용할 수 있으므로이 솔루션을 좋아합니다. 예를 들어

ls -tl $(find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}')

수정 날짜별로 정렬 된 목록보기를 봅니다. 또한 결과로 다른 작업을 수행하려는 경우 결과의 전체 경로를 갖는 것이 좋습니다 (열거 나 실행하는 등).