이것이 내가 실행하려는 명령입니다.
grep -r "printf" *.c
.c
내 cwd에 있는 모든 파일에서 모든 printf 행을 가져오려고 합니다 . 현재 내 현재 디렉터리는 Desktop이고 .c
Desktop 아래의 하위 디렉터리에 최소 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
같은 모든 명령에 대해 작동함 )
다음과 같은 기능을 사용합니다.wc
cp
tar
grep
에스et (켜다)쉿엘고르다globstar
명령으로 이온
shopt -s globstar
**
이로 인해 파일 이름 구성 요소가 여기와 아래의 모든 것을 의미하게 됩니다 . 따라서 에 있다면 Desktop
은 디렉토리
**
에 있는 모든 것을 의미합니다.Desktop
및 해당 하위 디렉터리. 그런 다음 사용할 수 있습니다
grep "printf" **/*.c
.c
와 그 아래의 모든 파일을 검색합니다 Desktop
. -r
셸이 자동으로 재귀를 수행하므로 를 지정할 필요가 없으며 --include
, 경로 이름 확장 패턴(glob 또는 와일드카드라고도 함)에 가 포함되어 있으므로 를 지정할 필요가 없습니다 *.c
.
당신은 할 수 있습니다유nset 옵션은 shopt -u
.