[shell] 여러 파일 유형에 대해 grep –include 옵션을 어떻게 사용합니까?

일부 디렉토리의 모든 html 파일을 grep하려면 다음을 수행합니다.

grep --include="*.html" pattern -R /some/path

잘 작동합니다. 문제는 일부 디렉토리의 모든 html, htm, php 파일을 grep하는 방법입니다.

grep –exclude /-include 구문을 사용하여 특정 파일을 통해 grep하지 않도록 하면 다음을 수행 할 수있는 것 같습니다.

grep --include="*.{html,php,htm}" pattern -R /some/path

그러나 슬프게도 그것은 나를 위해 작동하지 않을 것입니다.
참고로 내 grep 버전은 2.5.1입니다.



답변

여러 --include플래그 를 사용할 수 있습니다 . 이것은 나를 위해 작동합니다.

grep -r --include=*.html --include=*.php --include=*.htm "pattern" /some/path/

그러나 Deruijter제안 된 대로 수행 할 수 있습니다 . 이것은 나를 위해 작동합니다.

grep -r --include=*.{html,php,htm} "pattern" /some/path/

다음 findxargs같은 용도로 사용할 수 있다는 것을 잊지 마십시오 .

find /some/path/ -name "*.htm*" -or -name "*.php" | xargs grep "pattern"

HTH


답변

사용 {html,php,htm}단지로 동작 할 수 있습니다 중괄호 확장 비표준의 (POSIX 호환되지 않음) 기능입니다, bash, ksh,와 zsh.

  • 즉, 대상 스크립트에서 사용하지 마십시오 .이 경우 명시 적 다중 인수를 /bin/sh사용하십시오 .--include

  • grep그 자체는 표기법을 이해 하지 못합니다{...} .

중괄호 확장이 인식 되려면 명령 줄에서 인용되지 않은 (a의 일부) 토큰 이어야합니다 .

중괄호 확장 로 확장 여러 인수를 손에 그래서 경우에, grep보고 끝나는 여러 --include=... 사용자가 개별적으로 통과 한 것처럼, 옵션을.

중괄호 확장의 결과 는 함정이 있는 globbing (파일 이름 확장)의 대상이됩니다 .

  • 각 결과 인수는 다음 과 같이 인용되지 않은 글 로빙 메타 문자 를 포함하는 경우 일치하는 파일 이름으로 확장 될 수 있습니다.* . (예를 들어, 일치하는 것과 같은 이름 의 파일이 있어야 함)
    과 같은 토큰에서는 그렇지 않을 수 있지만 일반적으로 명심할 가치가 있습니다.--include=*.html--include=foo.html

  • 는 IF nullglob쉘 옵션이 켜져하는 일 (shopt -s nullglob )와 일치의 globbing을하지 아무것도 , 인수가됩니다 폐기 .

따라서 완전히 강력한 솔루션 을 얻으려면 다음을 사용하십시오.

grep -R '--include=*.'{html,php,htm} pattern /some/path
  • '--include=*.' 로 취급됩니다 작은 따옴표 로 인해 리터럴 . 이것은 *globbing 문자로의 부주의 한 해석을 방지 합니다.

  • {html,php,htm},-필요성- 인용되지 않은 중괄호 확장 [1]
    3 개의 인수로 확장됩니다 {...} .'...' 토큰 토큰포함하기 때문입니다.

  • 따라서 셸에서 따옴표를 제거한 후 다음 3 개의 리터럴 인수가 궁극적으로에 전달됩니다grep .

    • --include=*.html
    • --include=*.php
    • --include=*.htm

[1]보다 정확하게 는 괄호 확장 의 구문 관련 부분 만 인용 해제해야합니다. 목록 요소 는 여전히 개별적으로 인용 될 수 있으며 중괄호 확장 후 원치 않는 글 로빙을 초래할 수있는 글 로빙 메타 문자를 포함하는 경우 여야합니다. 이 경우에는 필요하지 않지만 위의 내용은 다음과 같이 쓸 수 있습니다.
'--include=*.'{'html','php','htm'}


답변

큰 따옴표를 제거해보십시오.

grep --include=*.{html,php,htm} pattern -R /some/path


답변

작동하지 않습니까?

  grep pattern  /some/path/*.{html,php,htm} 


답변

이 시도. -r은 재귀 검색을 수행합니다. -s는 파일을 찾을 수 없음 오류를 억제합니다. -n은 패턴이있는 파일의 줄 번호를 보여줍니다.

    grep "pattern" <path> -r -s -n --include=*.{c,cpp,C,h}


답변

동일한 목적으로 작동하지만 --include옵션이 없습니다. grep 2.5.1에서도 작동합니다.

grep -v -E ".*\.(html|htm|php)"


답변

명령 grep과 함께 사용find

find /some/path -name '*.html' -o -name '*.htm' -o -name '*.php' -type f
 -exec grep PATTERN {} \+

-regex-regextype옵션도 사용할 수 있습니다 .