재귀 적으로 폴더를 검색하지만 svn 하위 폴더는 제외


10

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

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

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

답변:


11

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

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

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


2
검색해야 할 다른 숨겨진 폴더가있는 경우로 변경 *하면 .더 깨끗합니다.
Kevin

또는 --recursive .OP에 이미 GNU가있는 것으로보고 대신 대신 사용하고 싶을 수도 있습니다 grep.
jw013

개인적 shopt -s dotglob으로 Bash에 *이미 도트 파일이 포함되어 있습니다. -r좋은,하지만 ack않습니다 기본적으로 너무 :)
ephemient

5

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


이에 대한 후속 조치로 현재 ag비슷하지만 빠르지 만을 사용합니다.
WhyNotHugo

2

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 {} \;

1

당신은 같은 디렉토리에 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=\*~"

1
필자는 실제로 폴더 내에서 실제로 검색 해야하는 경우 제외 목록을 무시할 수 있도록 별명을 사용 하여이 작업을 수행합니다. 변수를 설정하거나 해제하지 않고도 베어 그렙을 사용할 수 있습니다. 또한 쉽게 확장 할 수있는 폴더 목록을 유지 관리 할 수 ​​있고 더 이상 입력하지 않고도 제외 목록에 자동으로 추가 할 수 있습니다.
dragon788

좋은 접근 방법입니다. 또한 폴더에 grep 해야하는 경우 변수를 설정하는 것을 잊지 않을 것입니다. (그들을
잡을

0

awk 솔루션도 있습니다.

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.