찾기 - 분리에 의한 와일드카드

찾기 - 분리에 의한 와일드카드

나는 이전에 디렉토리 트리에서 .h 및 .c 파일을 검색한 다음 해당 파일에 대해 clang-format을 실행하는 스크립트를 작성했습니다.

find $directory -name '*.[hc]' -exec clang-format -i {} \;

이것은 예상대로 작동합니다. 이제 검색에 .cpp 파일을 추가하고 싶습니다. 그러나 둘 다

-name '*.{[hc],cpp}'

...도 아니다

-name '{*.[hc],*.cpp}'

일하다. 즉, 문서를 찾지 못했습니다.

find의 옵션을 사용하면 -o논리가 작동할 수 있다는 것을 알고 있습니다. 그러나 -name단일 명령으로 이를 수행할 수 있는 방법이 있어야 합니다 .

답변1

-name조건자와 함께 사용되는 패턴은 find표준 파일 이름 와일드카드 패턴입니다. find지원되지 않는 중괄호 확장을 사용하려고 합니다 .

없다는 점 참고해주세요하나의.c또는 로 끝나는 파일 이름과 일치하는 .h표준 와일드카드 패턴입니다 .cpp.

, , 및 '*.'{c,h,cpp}로 확장되지만 술어나 를 포함하지 않는 것과 같은 것을 사용할 수 있습니다 .*.c*.h*.cpp-name-o

다음으로 시도할 것은 이지만 '-o -name "*.'{c,h,cpp}'"'이는 세 개의 문자열 -o -name "*.c" -o -name "*.h"및 로 확장됩니다 -o -name "*.cpp". find개별 하위 문자열을 식별 하려면 공백으로 분할해야 하고 -o첫 번째 하위 문자열에서 제거해야 하기 때문에 이 방법도 작동하지 않습니다. 작동할 수도 있지만 eval그만한 가치보다는 문제가 더 많은 것 같습니다.

대신에 다음을 사용할 수 있습니다. -name테스트하려면 중간에 OR을 사용하세요.

find  "$directory" -type f \( -name '*.[ch]' -o -name '*.cpp' \) \
    -exec clang-format -i {} +

이는 -name이전에 설명한 두 가지 테스트( -oOR 연산자) 를 사용하고 clang-format발견된 경로 이름을 각 파일에 대해 한 번 호출하는 대신 일괄적으로 도구에 전달하여 호출 수를 최소화합니다.

약간의 추가 프로그래밍을 통해 목록에서 선택하려는 모든 파일 이름 접미사를 저장하고 find그로부터 원하는 표현을 만들 수 있습니다.

어떤 쉘을 사용하고 있는지 언급하지 않았으므로 shPOSIX 쉘에 대해 이 작업을 수행하고 있습니다.

set -- c h cpp

for suffix do
    set -- "$@" -o -name "*.$suffix"
    shift
done

shift # shifts off the initial "-o"

find "$directory" -type f \( "$@" \) -exec clang-format -i {} +

또는

set --
for suffix in c h cpp; do
    set -- "$@" -o -name "*.$suffix"
done

shift

find "$directory" -type f \( "$@" \) -exec clang-format -i {} +

이 예의 확장된 목록 "$@"은 다음과 같습니다.

-name '*.c' -o -name '*.h' -o -name '*.cpp'

답변2

-name쉘 글로브와 다른 모드를 지원하지만 중괄호를 지원하지 않으며(GNU 찾기 매뉴얼 페이지에서 이를 명시적으로 언급함) ksh 스타일 확장 글로브도 지원하지 않습니다.

하지만 많은 find사람들이 이를 지지하고 -regex있고 여러분도 그것을 사용할 수 있을 것입니다. 지원하는 정규식 방언에 따라 다릅니다 find(예: 표준 기본 정규식).아니요대체가 지원됩니다.

GNU find를 사용하면 다음과 같이 작동합니다.

find . -regextype posix-extended -regex '.*\.(c|h|cpp)'

(또한 일치 항목은 파일 이름 부분뿐만 아니라 전체 경로에 대해 일치하지만 파일 이름의 마지막 접미사만 일치하는 경우에는 문제가 되지 않습니다.)

관련 정보