grep -R에서 디렉토리를 어떻게 제외시킬 수 있습니까?


668

"node_modules"디렉토리를 제외한 모든 하위 디렉토리를 탐색하고 싶습니다.



14
그냥 "남자 GREP"를 입력하면 --exclude 볼 수 있습니다, 그리고 거기에 나열된 --exclude-DIR 옵션 -이 질문의 제목에서, 나는 ... 당신이 이미 그렙에 대해 알고 가정입니다
arcseldon

35
당신이 자식 저장소에 코드를 grepping중인 경우 node_modules당신에 .gitignore, git grep "STUFF"가장 쉬운 방법입니다. git grep작업 트리에서 추적 된 파일을 검색하고 다음 항목을 모두 무시합니다..gitignore
0xcaff

2
노드의 예 : grep -R --exclude-dir={node_modules,bower_components} "MyString" | cut -c1-"$COLUMNS"-또한 쉘에서 항상 'nodegrep'등으로 별칭을 지정하고 명령 인수를 문자열 입력으로 사용할 수 있습니다.
bshea

답변:


394

솔루션 1 (결합 findgrep)

이 솔루션의 목적은 grep성능 을 다루는 것이 아니라 휴대용 솔루션을 보여주는 것입니다. busybox 또는 2.5 이전의 GNU 버전에서도 작동합니다.

findfoo 및 bar 디렉토리를 제외 하려면을 사용하십시오 .

find /dir \( -name foo -prune \) -o \( -name bar -prune \) -o -name "*.sh" -print

그런 다음 휴대용 솔루션으로의 find비재 귀적 사용을 결합 하십시오 grep.

find /dir \( -name node_modules -prune \) -o -name "*.sh" -exec grep --color -Hn "your text to find" {} 2>/dev/null \;

솔루션 2 (의 재귀 적 사용 grep) :

이 솔루션은 이미 알고 있지만 가장 최근의 효율적인 솔루션이므로 추가합니다. 이 솔루션은 이식성이 떨어지지 만 사람이 읽을 수있는 솔루션입니다.

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

여러 디렉토리를 제외하려면 --exclude-dir다음과 같이 사용하십시오 .

--exclude-dir={node_modules,dir1,dir2,dir3}

솔루션 3 (Ag)

코드를 자주 검색하는 경우 Ag (The Silver Searcher) 는 grep보다 훨씬 빠른 대안이며 코드 검색에 맞게 사용자 정의됩니다. 예를 들어에 나열된 파일과 디렉토리는 자동으로 무시 .gitignore되므로 동일한 성가신 제외 옵션을 grep또는 에 계속 전달할 필요가 없습니다 find.


2
이 조합 --exclude-dir=dir은 보다 빠르게 검색 하고 색상으로 결과를 보여줍니다-읽기 쉬운
Maxim Yefremov

27
"이 조합" find ... -execgrep --exclude-dir나 보다 빠르지 않습니다 . 그렙에 큰 장점 (약 5 배 빠르며 HDD에 38K +의 필터링 26K + 파일 포함), 당신 않는 한 교체 \;+찾기 / 간부 콤보합니다. 그런 다음 grep은 "30 % 정도 더 빠릅니다". grep 구문은 사람이 읽을 수 있습니다 :).
Kjell Andreassen 님이

이것이 명백하기 때문에 동의했습니다. 일부 비지 박스에는 GREP 명령이 없습니다.
hornetbzz

10
또한 다음을 사용하여 여러 항목을 제외 할 수 있습니다.--exclude-dir={dir1,dir2}
suh

4
나는 node_modules정식 예인 것이 가장 놀랍지 않습니다 .
pdoherty926

982

최신 버전의 GNU Grep (> = 2.5.2 )는 다음을 제공합니다.

--exclude-dir=dir

dir재귀 디렉토리 검색에서 패턴 과 일치하는 디렉토리를 제외합니다 .

그래서 당신은 할 수 있습니다 :

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

구문과 사용법에 대한 자세한 내용은

이전 GNU Greps 및 POSIX Grep의 경우 find다른 답변에서 제안한대로 사용하십시오 .

또는 ack( Edit : 또는 The Silver Searcher )를 사용하여 완료하십시오!


4
@Manocho : ack훌륭 하다고 생각되면 Silver Searcher를 사용해보고 속도가 향상됩니다!
Johnsyweb

30
초조 한 구문 : 쉘의 파일 글 로빙이 아닌 '정규식 패턴을 --exclude-dir=dir사용 합니다. 패턴은 현재 디렉토리와 관련된 경로에서 작동합니다. 그래서 패턴을 사용 하지 . grep--exclude-dir=dir--exclude-dir="/root/dir/*"
tanius

15
검색에서 여러 디렉토리를 제외하려면 다음을 사용하는 것보다 더 나은 옵션이 $ grep -r --exclude-dir=dir1 --exclude-dir=dir2 "string" /path/to/search/dir있습니까?
Darshan Chaudhary

4
나는 아마도 제정신이 아닌 사람보다 이것에 너무 많은 시간을 보냈지 만, 내 인생에서 검색에서 하위 디렉토리를 제외시키는 방법을 알아낼 수 는 없지만 grep -r --exclude-dir=public keyword .작동 grep -r --exclude-dir='public/dist' keyword .하지는 않습니다. 정규식 와일드 카드 추가, 문자 이스케이프 등을 시도했지만 아무것도 도움이되지 않는 것 같습니다.
dkobozev

72
다음과 같이 여러 디렉토리를 제외하십시오.grep -r "Request" . --exclude-dir={node_modules,git,build}
maverick97

77

여러 디렉토리 를 제외 하려면 다음을 수행하십시오.

재귀의 경우 "r", 일치하는 파일 이름 만 인쇄하려면 "l", 대소 문자 구분을 무시하려면 "i":

grep -rli --exclude-dir={dir1,dir2,dir3} keyword /path/to/search

예 : 'hello'라는 단어가 포함 된 파일을 찾고 싶습니다. proc 디렉토리, 부트 디렉토리, sys 디렉토리 및 루트 디렉토리를 제외한 모든 Linux 디렉토리에서 검색하고 싶습니다 .

grep -rli --exclude-dir={proc,boot,root,sys} hello /

참고 : 위의 예는 루트 여야합니다

참고 2 (@skplunkerin에 따라) : 쉼표 뒤에 공백을 추가하지 마십시오 {dir1,dir2,dir3}


5
참고 :{dir1,dir2,dir3}
skplunkerin

감사합니다. SVN 작업 공간을 통해 grep 할 때 편리합니다.grep -Irsn --exclude-dir=.svn 'foo' .
RAM237

1
--exclude-dir옵션을 여러 번 제공 할 수 있습니다 .
Walf

44

이 문법

--exclude-dir={dir1,dir2}

에 의해가 아니라 쉘 (예 : Bash)에 의해 다음과 같이 확장됩니다 grep.

--exclude-dir=dir1 --exclude-dir=dir2

인용하면 쉘이 확장되지 않으므로 작동하지 않습니다.

--exclude-dir='{dir1,dir2}'    <-- this won't work

함께 사용되는 --exclude-dir패턴은 --exclude옵션 에 대한 매뉴얼 페이지에 설명 된 것과 동일한 종류의 패턴입니다 .

--exclude=GLOB
    Skip files whose base name matches GLOB (using wildcard matching).
    A file-name glob can use *, ?, and [...]  as wildcards, and \ to
    quote a wildcard or backslash character literally.

쉘은 일반적으로 그러한 패턴 자체를 확장 하려고 시도 하므로 이것을 피하려면 인용해야합니다.

--exclude-dir='dir?'

중괄호와 인용 제외 패턴을 다음과 같이 함께 사용할 수 있습니다.

--exclude-dir={'dir?','dir??'}

패턴은 여러 경로 세그먼트에 걸쳐있을 수 있습니다.

--exclude-dir='some*/?lse'

이 같은 디렉토리는 제외 topdir/something/else됩니다.


13

이것을 자주 사용하십시오 :

grep-r(재귀 적), i(무시) 및 -o(일치하는 라인의 일부만 인쇄 ) 와 함께 사용할 수 있습니다 . files사용 --exclude을 제외하고 디렉토리를 제외 하려면을 사용하십시오 --exclude-dir.

그것을 합하면 다음과 같은 결과가 나타납니다.

grep -rio --exclude={filenames comma separated} \
--exclude-dir={directory names comma separated} <search term> <location>

설명하면 실제보다 훨씬 더 복잡하게 들립니다. 간단한 예를 들어 설명하기가 더 쉽습니다.

예:

debugger디버깅 세션 중에 문자열 값을 명시 적으로 설정하고 검토 / 제거하려는 모든 장소에서 현재 프로젝트를 검색한다고 가정 합니다.

나는라는 스크립트를 작성하고 모든 발생을 찾는 데 findDebugger.sh사용 grep합니다. 하나:

파일 제외의 경우- .eslintrc무시 되도록하고 싶습니다 (실제로 보푸라기 규칙 debugger이 있으므로 제외해야합니다). 마찬가지로, 나는 내 스크립트가 결과에서 참조되는 것을 원하지 않습니다.

디렉토리 제외의 경우- node_modules참조하는 많은 라이브러리가 포함되어 있기 때문에 제외 하고 싶지만 debugger그 결과에 관심이 없습니다. 또한 검색 위치에 신경 쓰지 않고 검색 성능을 유지하기 위해 디렉토리 를 생략 .idea하고 .git숨기고 싶습니다.

결과는 다음 findDebugger.sh과 같습니다 -나는 다음과 같은 스크립트를 작성합니다 .

#!/usr/bin/env bash
grep -rio --exclude={.eslintrc,findDebugger.sh} \
--exclude-dir={node_modules,.idea,.git} debugger .

"r"옵션은 대문자 "-R"로 인쇄해야한다고 생각합니다.
hornetbzz

1
흥미 롭군 "r"은 항상 nix와 mac에서 저에게 효과적이었습니다.
arcseldon

내 대답을 쓸 때 사용했습니다 -R(지금 이유를 기억하지 못합니다). 나는 일반적으로 사용 -r합니다. 대문자 버전 은 심볼릭 링크를 따른다 는 것이 밝혀졌습니다 . 틸.
Johnsyweb

@ Johnsyweb-감사합니다. 당신의 대답을
올바로 옮겼습니다

10

당신은 같은 것을 시도 할 수 있습니다 grep -R search . | grep -v '^node_modules/.*'


34
어떤 경우에는 그렇게 좋은 해결책이 아닙니다. 예를 들어, 'node_modules'디렉토리가 많은 오 탐지 일치 (따라서 디렉토리를 필터링해야 함)가있는 거대한 디렉토리 인 경우 첫 번째 grep은 서브 디렉토리를 통해 검색하는 데 많은 시간을 낭비하고 두 번째 grep 필터링은 일치합니다. 첫 번째 grep 자체에서 node_modules를 제외하는 것이 더 빠릅니다.
GuruM

2
내가 명령을 볼 수, 속도 저하에 대해 걱정하고 무엇을 모르는
Funkodebat

1
Guru의 의견에 대한 Ditto. 의 GREP /var중단 때 그것은 명중 /var/run내 경우. 따라서 먼저 디렉토리를 피하고 싶은 이유가 있습니다.
jww

3
--exclude-dir
Omar Tariq

10

당신이 자식 저장소에 코드를 grepping중인 경우 node_modules당신에 .gitignore, 당신은 사용할 수 있습니다 git grep. git grep작업 트리에서 추적 된 파일을 검색하여.gitignore

git grep "STUFF"

이것은 매우 유용한 팁입니다. 감사합니다.
NKM

4

"node_modules"내부에서 검색하지 않으려 는 Node.js를 다루는 사람들에게 특히 유용합니다 .

find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword

2

간단한 작업 명령 :

root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"

위의 현재 디렉토리 "dspace"에서 "creativecommons.org"텍스트를 grep하고 dirs {log, assetstore}를 제외합니다.

끝난.


대괄호 안에 여러 디렉토리를 포함하여
깔끔함

2

많은 정답은 여기에 주어졌다,하지만 난 어떤 돌진 시도하기 전에 실패의 원인이 한 점을 강조하기 위해이 하나를 추가 해요 : exclude-dir소요 패턴 의 디렉토리가 아닌 경로를.

검색어가 다음과 같다고 가정 해 보겠습니다.

grep -r myobject

그리고 결과는의 결과로 복잡해집니다 src/other/objects-folder. 이 명령은 의도 한 결과를 제공 하지 않습니다 .

grep -r myobject --exclude-dir=src/other/objects-folder

그리고 왜 exclude-dir작동하지 않는지 궁금 할 것입니다 ! 에서 결과를 실제로 제외하려면 objects-folder다음을 수행하십시오.

grep -r myobject --exclude-dir=objects-folder

즉, 경로가 아닌 폴더 이름 만 사용하십시오 . 일단 당신이 그것을 알고 있다면.

매뉴얼 페이지에서 :

--exclude-dir = GLOB
패턴 GLOB와 일치하는 이름 접미사가있는 명령 행 디렉토리를 건너 뜁니다. 재귀 적으로 검색 할 때 기본 이름이 GLOB와 일치하는 서브 디렉토리를 건너 뛰십시오. GLOB에서 중복 슬래시를 무시하십시오.


2

이것은 나를 위해 작동합니다 :

grep <stuff> -R --exclude-dir=<your_dir>

5
이 답변은 이미 게시 된 내용과 어떻게 다릅니 까?
aexl

1
find . ! -name "node_modules" -type d 

-1

더 간단한 방법은 "grep -v"를 사용하여 결과를 필터링하는 것입니다.

grep -i needle -R * | grep -v node_modules


12
이것은 실제로 3 년 전에 제공된 DipSwitch와 동일한 대답입니다. 같은 문제가 있습니다.
jww
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.