모든 하위 디렉토리의 문자열에 대한 grep이 작동하지 않는 이유는 무엇입니까?

모든 하위 디렉토리의 문자열에 대한 grep이 작동하지 않는 이유는 무엇입니까?

이것이 내가 실행하려는 명령입니다.

grep -r "printf" *.c

.c내 cwd에 있는 모든 파일에서 모든 printf 행을 가져오려고 합니다 . 현재 내 현재 디렉터리는 Desktop이고 .cDesktop 아래의 하위 디렉터리에 최소 10-15개의 파일이 있지만 이 명령은 일치하는 항목을 전혀 표시하지 않습니다. 그렇다면 이 경우 어떻게 작동하게 만들 수 있을까요?

답변1

그렇게 하는 경우:

grep -r "printf" *.c

쉘은 현재 디렉토리에서 *.c끝나는 모든 파일/디렉토리로 확장됩니다 .c. 그러한 파일/디렉토리가 없으면 패턴은 문자 그대로 처리됩니다(아마도 nullglob설정하지 않았을 것입니다).

보시다시피, 현재 디렉터리에 파일이 없거나 .c파일이 있더라도 해당 파일이 없어 printf빈 출력이 발생하므로 현재 패턴은 현재 디렉터리 아래로 절대 이동하지 않습니다.

--include선택적 파일에서만 검색하고 재귀적으로 탐색하려면 다음을 사용해야 합니다 -r.

grep -r --include="*.c" "printf" .

위의 명령은 현재 디렉터리부터 반복적으로 시작하여 모든 .c파일에서 문자열 (pattern) 을 검색합니다.printf

모든 심볼릭 링크를 따르려면 다음을 수행하십시오.

grep -R --include="*.c" "printf" .

답변2

명령이 작동하지 않는 이유를 알고 싶다면 다음을 참조하세요.다른 대답. 작동 방법을 알고 싶다면 여기 에 또 다른 접근 방식이 있습니다. 디렉토리 아래의 특정 확장자를 가진 파일의 Grepbash 의 기능이 아닌 의 기능을 사용하는 (따라서 뿐만 아니라 , 또는 와 grep 같은 모든 명령에 대해 작동함 ) 다음과 같은 기능을 사용합니다.wccptargrep

에스et (켜다)고르다globstar명령으로 이온

shopt -s globstar

**이로 인해 파일 이름 구성 요소가 여기와 아래의 모든 것을 의미하게 됩니다 . 따라서 에 있다면 Desktop은 디렉토리 **에 있는 모든 것을 의미합니다.Desktop및 해당 하위 디렉터리. 그런 다음 사용할 수 있습니다

grep "printf" **/*.c

.c와 그 아래의 모든 파일을 검색합니다 Desktop. -r셸이 자동으로 재귀를 수행하므로 를 지정할 필요가 없으며 --include, 경로 이름 확장 패턴(glob 또는 와일드카드라고도 함)에 가 포함되어 있으므로 를 지정할 필요가 없습니다 *.c.


당신은 할 수 있습니다nset 옵션은 shopt -u.

관련 정보