grep -R에서 디렉토리를 제외하려면 어떻게해야합니까?
"node_modules"디렉토리를 제외한 모든 하위 디렉토리를 탐색하고 싶습니다.
해결 방법 1 ( find
와 결합 grep
)
이 솔루션의 목적은 grep
성능 을 다루는 것이 아니라 휴대용 솔루션을 보여주는 것입니다. busybox 또는 2.5 이전의 GNU 버전에서도 작동해야합니다.
find
foo 및 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 man 페이지
- 관련 StackOverflow 답변 특정 파일을 통해 grep하지 않으려면 grep --exclude /-include 구문을 사용하십시오.
이전 GNU Greps 및 POSIX Grep의 경우 find
다른 답변에서 제안한대로 사용하십시오 .
또는 ack
( 편집 : 또는 Silver Searcher )를 사용하고 완료하십시오!
여러 디렉토리를 제외하려면 다음을 수행하십시오.
"r"은 재귀, "l"은 일치하는 파일 이름 만 인쇄하고 "i"는 대소 문자 구분을 무시합니다.
grep -rli --exclude-dir = {dir1, dir2, dir3} 키워드 / 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
옵션 의 man 페이지에 설명 된 것과 동일한 유형의 패턴입니다 .
--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
can be used in conjunction with -r
(recursive), i
(ignore case) and -o
(prints only matching part of lines). To exclude files
use --exclude
and to exclude directories use --exclude-dir
.
Putting it together you end up with something like:
grep -rio --exclude={filenames comma separated} \
--exclude-dir={directory names comma separated} <search term> <location>
Describing it makes it sound far more complicated than it actually is. Easier to illustrate with a simple example.
Example:
Suppose I am searching for current project for all places where I explicitly set the string value debugger
during a debugging session, and now wish to review / remove.
I write a script called findDebugger.sh
and use grep
to find all occurrences. However:
For file exclusions - I wish to ensure that .eslintrc
is ignored (this actually has a linting rule about debugger
so should be excluded). Likewise, I don't want my own script to be referenced in any results.
For directory exclusions - I wish to exclude node_modules
as it contains lots of libraries that do reference debugger
and I am not interested in those results. Also I just wish to omit .idea
and .git
hidden directories because I don't care about those search locations either, and wish to keep the search performant.
So here is the result - I create a script called findDebugger.sh
with:
#!/usr/bin/env bash
grep -rio --exclude={.eslintrc,findDebugger.sh} \
--exclude-dir={node_modules,.idea,.git} debugger .
You could try something like grep -R search . | grep -v '^node_modules/.*'
If you are grepping for code in a git repository and node_modules
is in your .gitignore
, you can use git grep
. git grep
searches the tracked files in the working tree, ignoring everything from .gitignore
git grep "STUFF"
Very useful, especially for those dealing with Node.js where we want to avoid searching inside "node_modules":
find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword
A simple working command:
root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"
Above I grep for text "creativecommons.org" in current directory "dspace" and exclude dirs {log,assetstore}.
Done.
find . ! -name "node_modules" -type d
this one works for me
grep <stuff> -R --exclude-dir=<your_dir>
Many correct answers have been given here, but I'm adding this one to emphasize one point which caused some rushed attempts to fail before: exclude-dir
takes a pattern, not a path to a directory.
Say your search is:
grep -r myobject
And you notice that your output is cluttered with results from the src/other/objects-folder
. This command will not give you the intended result:
grep -r myobject --exclude-dir=src/other/objects-folder
And you may wonder why exclude-dir
isn't working! To actually exclude results from the objects-folder
, simply do this:
grep -r myobject --exclude-dir=objects-folder
In other words, just use the folder name, not the path. Obvious once you know it.
From the man page:
--exclude-dir=GLOB
Skip any command-line directory with a name suffix that matches the pattern GLOB. When searching recursively, skip any subdirectory whose base name matches GLOB. Ignore any redundant trailing slashes in GLOB.
A simpler way would be to filter your results using "grep -v".
grep -i needle -R * | grep -v node_modules
참고URL : https://stackoverflow.com/questions/6565471/how-can-i-exclude-directories-from-grep-r
'code' 카테고리의 다른 글
같은 여러 개를 가질 수 있습니까? (0) | 2020.10.03 |
---|---|
REST API-실제 사례가 포함 된 PUT 대 PATCH (0) | 2020.10.03 |
android : layout_weight는 무엇을 의미합니까? (0) | 2020.10.02 |
바이트 배열을 문자열로 변환하는 방법 (0) | 2020.10.02 |
PuTTy 세션 목록을 내보내거나 가져 오는 방법은 무엇입니까? (0) | 2020.10.02 |