나는 이것을 실행하고 싶다 :
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 {} +
또는 쉘을 사용하는 경우 bash
nullglob 옵션을 설정하여 확장되지 않은 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"를 한 번만 실행할 수 있습니다.