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

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



답변

솔루션 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.


답변

최신 버전의 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 )를 사용하여 완료하십시오!


답변

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

재귀의 경우 “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}


답변

이 문법

--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됩니다.


답변

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

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 .


답변

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


답변

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

git grep "STUFF"