code

grep -R에서 디렉토리를 제외하려면 어떻게해야합니까?

codestyles 2020. 10. 3. 10:42
반응형

grep -R에서 디렉토리를 제외하려면 어떻게해야합니까?


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


해결 방법 1 ( find결합 grep)

이 솔루션의 목적은 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( 편집 : 또는 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

반응형