grep 재귀 검색에서 해당 디렉터리 경로로 지정된 중첩 하위 디렉터리를 제외하는 방법이 있습니까?

grep 재귀 검색에서 해당 디렉터리 경로로 지정된 중첩 하위 디렉터리를 제외하는 방법이 있습니까?

ack아니면 이것을 사용 하거나 find달성 해야 합니까 ?

이것이 내가 원하는거야. 다음과 같은 디렉터리 구조가 있다고 가정해 보겠습니다.

dir/nesteddir/match.txt
otherdir/nesteddir/match.txt

첫 번째 중첩 디렉터리만 제외하는 방법은 무엇입니까? grep을 사용하는 것도 가능합니까? 가장 확실한 대답은 $ grep -r --exclude-dir="dir/nesteddir" "stringToFind" .작동하지 않는 것 같으며 --exclude-dirglobbing, Leading 등을 사용하는 ./다양한 경로에 대한 내 실험도 수행되지 않습니다.

매뉴얼 페이지를 읽고 인터넷 검색을 해도 도움이 되지 않았습니다. 제가 찾은 이 사용 사례에 대한 유일한 언급은 다음 질문이었습니다.grep --exclude-dir 동작: 버그 또는 기능?

결론은 grep 2.12에서 소개된 버그라는 것인데, 저는 최신 버전(2.16)과 grep의 버그 트래커(https://debbugs.gnu.org/cgi/pkgreport.cgi?package=grep)에는 그와 관련된 내용이 전혀 언급되어 있지 않으므로 --exclude-dir수정되었거나 예상되는 동작인 것으로 추측됩니다.

약간의 설명을 얻는 것이 정말 좋을 것입니다.

답변1

인수는 --exclude-dir디렉터리의 기본 이름(즉, 상위 상위 디렉터리가 없는 부분)과 일치하는 패턴입니다. 예를 들어 및 (및 해당 하위 디렉터리)를 --exclude-dir=nesteddir제외합니다 .dir/nesteddirotherdir/nesteddir

GNU grep만 사용하여 동일한 이름을 가진 다른 디렉터리를 제외하지 않고 하나의 디렉터리를 제외할 수 있는 방법은 없습니다. 파일을 선택하려면 GNU find와 같은 보다 정교한 방법을 사용해야 합니다.

find dir -path dir/nesteddir -prune -o -type f -exec grep -H 'pattern' {} +

관련 정보