"찾기" 이름 패턴 압축

"찾기" 이름 패턴 압축

나는 사용하고있다

find . -name '*.[cCHh][cC]' -exec grep -nHr "$1" {} ';'
find . -name '*.[cCHh]' -exec grep -nHr "$1" {} ';'

.c, .C, .h, .H, .cc 및 .CC로 끝나는 모든 하위 디렉터리에 나열된 모든 파일에서 문자열을 검색합니다. 하지만 여기에는 두 개의 명령이 포함되어 있기 때문에 비효율적이라고 느껴집니다.

하나의 정규식을 사용하여 .c, .C, .h, .H, .cc 및 .CC 파일을 포함하는 정규식을 작성하려면 어떻게 해야 합니까?

편집: 저는 이것을 Linux 머신의 bash에서 실행하고 있습니다.

답변1

주제에서 언급한 대로(잘못된 쉘 모드를 사용하고 있음) 정규식을 사용해야 합니다.

find . -iregex '.*\.[ch]+'

위의 방법은 .ch, .hh 및 유사한 파일이 있는 경우 이를 찾는 게으른 접근 방식입니다. 정확한 일치를 위해서는 여전히 원하는 것을 열거해야 하지만 정규식을 사용하는 것이 여전히 더 쉽습니다.

find . -regex '.*\.\(c\|C\|cc\|CC\|h\|H\)'

답변2

이식 가능/표준(POSIX, Unix(SUS) 및 Linux(LSB) 표준) 및 효율적이므로 다음과 같이 작성할 수 있습니다.

find . \( -name '*.cc' -o -name '*.CC' -o -name '*.[cChH]' \) \
  -type f -exec grep -n -- "$1" /dev/null {} +

여기서 가장 중요한 것은 +대신에 를 사용하는 것입니다 ;. 그렇지 않으면 각 파일에 대해 grep 명령을 실행하게 됩니다.

-H옵션은 GNU에만 적용되지만 추가하면 /dev/null( grep최소 두 개의 파일을 찾도록) grep에 파일 이름이 표시됩니다.

$1로 시작하지 않는 한 "--"가 필요합니다 -.

-type f비정규 파일(예: 디렉터리)을 보는 것을 피하기 위해 여기에 추가되었지만 이는 생략할 수 있는 심볼릭 링크도 제외함을 의미합니다.

답변3

다음 줄로 단축할 수 있습니다.

find -type f -regextype posix-egrep -iregex '.*\.(cc|h|c)$' -exec grep -nHr "$1" {} \;

관련 정보