./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
하는 반면, ' 옵션은 해당 형식을 입력으로 사용합니다. 이렇게 하면 파일에 있는 흥미로운 문자가 파이프에 혼동되지 않게 됩니다. 이 옵션을 사용 하면 아무 것도 발견되지 않더라도 오류가 발생하지 않습니다 .NUL
xargs
-0
-r
find
이제 다음을 수행할 수 있습니다.
find . -type f -print0 | grep -z -v "FILENAME EXCLUDE PATTERN" |
xargs -r0 grep 'PATTERN'
GNU grep은 -z
xargs' 와 동일한 작업을 수행합니다 -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')