나는 사용하고있다
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" {} \;