여러 디렉터리에 대한 Grep 쿼리

여러 디렉터리에 대한 Grep 쿼리

나는 이것을 실행하고 싶다 :

grep -r zlib *.cpp

그러나 현재 디렉터리에 .cpp 파일이 없으면 실패합니다(이 경우 검색만 수행됨).

 grep: *.cpp: No such file or directory

지금:

grep -r zlib *

전체 계층 구조가 검색되지만 검색을 .cpp 파일로 제한하고 싶습니다.

사람들과 많은 요리법 사이트를 검색했지만 간단한 쿼리라고 생각되는 것에 대한 답변을 찾을 수 없습니다. 미리 사과드립니다.

답변1

grep현재 쉘과는 아무 관련이 없습니다 . 명령을 실행하기 전에 쉘은 *.cpp현재 디렉토리의 모든 cpp 파일 이름으로 확장됩니다 grep. *.cpp쉘은 파일 이름을 찾을 수 없기 때문에 glob을 확장하지 않습니다. 명령 grep은 이것이 파일인지 확인하려고 시도하지만 실제 파일이 아님을 발견합니다.

몇 가지 옵션이 있습니다.find

find . -type f -name "*.cpp" -exec grep -r zlib {} +

또는 쉘을 사용하는 경우 bashnullglob 옵션을 설정하여 확장되지 않은 glob을 유효한 결과로 반환하는 것을 중지합니다. (..)확장 쉘 옵션을 쉘에서 영구적으로 만드는 것이 아니라 임시로 만드는 것이 목적 입니다. 해당 --include=*.cpp옵션을 갖는 이유는 이를 설정하면 전역 확장에 실패할 경우 *.cpp빈 상태가 되고 명령이 가 되기 때문입니다 grep -r zlib. 즉, 아래 하위 디렉터리 전체를 검색한다는 의미입니다.

( shopt -s nullglob; grep -r --include=*.cpp zlib . ; )

또 다른 변형에는 --include옵션이 없지만 하위 디렉터리에서 재귀적인 전역 확장을 허용하는 옵션을 grep사용합니다.globstar

( shopt -s nullglob globstar; grep -rH zlib **/*.cpp  ; )

이를 기억하고 --include=POSIX -H와 호환되지 않는 GNU grep 옵션입니다.

답변2

zsh 쉘 사용자는 이중 별표를 사용하여 자연스럽게 이를 달성할 수 있는 내장 와일드카드 구문이 있음을 빠르게 지적할 것입니다.

grep -r zlib **/*.cpp

원한다면 영구적으로 전환할 필요 없이 "zsh"를 한 번만 실행할 수 있습니다.

관련 정보