특정 경로에 있는 파일을 제외하려면 "grep"을 실행하세요.

특정 경로에 있는 파일을 제외하려면 "grep"을 실행하세요.

./test/main.cpp이 파일을 검색에서 제외하고 싶습니다 .

이것이 내가 보는 것입니다:

$ grep -r pattern --exclude=./test/main.cpp
./test/main.cpp:pattern
./lib/main.cpp:pattern
./src/main.cpp:pattern

파이프 및 필터 배열에서 여러 명령을 사용하여 원하는 출력을 얻을 수 있다는 것을 알고 있지만 grep기본적으로 원하는 것을 이해할 수 있는 인용/이스케이프가 있습니까?

답변1

grep서로 다른 디렉토리에 동일한 이름을 가진 여러 파일이 있는 경우 디렉토리의 파일에 대해 이 작업을 수행할 수 없습니다. 대신 find를 사용하십시오.

find . -type f \! -path './test/main.cpp' -exec grep pattern {} \+

답변2

나는 그것이 GNU로는 가능하지 않다고 생각한다 grep. 하지만 파이프는 필요하지 않습니다.

그리고 find:

find . ! -path ./test/main.cpp -type f -exec grep pattern {} +

그리고 zsh:

grep pattern ./**/*~./test/main.cpp(.)

(숨겨진 파일을 제외하고 .git, .svn...도 제외합니다.)

답변3

나는 책을 쓸 수도 있다: 잃어버린 예술 xargs. 각 파일에 대해 grep을 시작합니다 find ... -exec … ';(그러나 with 변형은 -exec … +그렇지 않습니다). 글쎄요, 우리는 지금 CPU 사이클을 낭비하고 있습니다. 그렇다면 왜 안 될까요? 그러나 성능, 메모리 및 전력 소비가 문제인 경우 xargs를 사용하십시오.

find . -type f \! -path 'EXCLUDE-FILE' -print0 | xargs -r0 grep 'PATTERN'

GNU의 find'는 출력을 종료 -print0하는 반면, ' 옵션은 해당 형식을 입력으로 사용합니다. 이렇게 하면 파일에 있는 흥미로운 문자가 파이프에 혼동되지 않게 됩니다. 이 옵션을 사용 하면 아무 것도 발견되지 않더라도 오류가 발생하지 않습니다 .NULxargs-0-rfind

이제 다음을 수행할 수 있습니다.

find . -type f -print0 | grep -z -v "FILENAME EXCLUDE PATTERN" | 
  xargs -r0 grep 'PATTERN'

GNU grep은 -zxargs' 와 동일한 작업을 수행합니다 -0.

답변4

참고로 제가 선호하는 방법은 다음과 같습니다.

grep pattern $(find . -type f ! -path './test/main.cpp')

명령 시작 부분에 남겨두면 grep이것이 좀 더 명확해질 것이며 grep색상 강조 표시가 비활성화되지 않을 것입니다. 어떤 의미에서 명령 대체를 사용하는 것은 (제한된) 파일 검색 기능 하위 집합을 확장/교체하는 방법 find일 뿐입니다 .grep


나를 위한,find -exec통사론조금 신비 롭습니다. 한 가지 문제 find -exec는 (때때로) 다양한 문자를 이스케이프 처리해야 한다는 점입니다(특히 \;Bash에서 사용할 경우). 익숙한 상황에 맞게 설명하면 다음 두 명령은 기본적으로 동일합니다.

find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern

네가 원한다면하위 디렉터리 제외, 와일드카드가 필요할 수 있습니다. 나는 여기서 패턴을 완전히 이해하지 못합니다.미스터리에 대해 이야기하다:

grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )

일반화 기반 find솔루션 에 대한 추가 설명스크립트에 사용됨: grep명령줄에는 -H/ --with-filename옵션이 포함되어야 합니다. 그렇지 않으면 검색 결과에 파일 이름이 하나만 있는 경우 출력 형식이 변경됩니다 find. 기본 파일 검색(이 옵션 사용) 을 사용하는 경우에는 grep필요하지 않은 것 같으 므로 이는 주목할 가치가 있습니다 -r.

...하지만 /dev/null첫 번째 파일로 검색하는 것이 더 좋습니다. 이는 두 가지 문제를 해결합니다.

  • 검색할 파일이 하나인 경우 grep두 개가 있다고 가정하고 다중 파일 출력 모드를 사용하는지 확인합니다.
  • 검색할 파일이 없으면 파일이 grep있다고 가정하고 표준 입력을 기다리지 않도록 합니다.

따라서 최종 답변은 다음과 같습니다.

grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')

관련 정보