기록을 위해, 내가 선호하는 접근 방식은 다음과 같습니다.
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
하나의 파일이 있다고 생각하고 stdin을 기다리지 않습니다.
최종 답변은 다음과 같습니다.
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')
--exclude-dir
. 그래서 grep이 기본적으로 제외를 수행하도록하고 싶습니다.