나는 이전에 디렉토리 트리에서 .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
이전에 설명한 두 가지 테스트( -o
OR 연산자) 를 사용하고 clang-format
발견된 경로 이름을 각 파일에 대해 한 번 호출하는 대신 일괄적으로 도구에 전달하여 호출 수를 최소화합니다.
약간의 추가 프로그래밍을 통해 목록에서 선택하려는 모든 파일 이름 접미사를 저장하고 find
그로부터 원하는 표현을 만들 수 있습니다.
어떤 쉘을 사용하고 있는지 언급하지 않았으므로 sh
POSIX 쉘에 대해 이 작업을 수행하고 있습니다.
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)'
(또한 일치 항목은 파일 이름 부분뿐만 아니라 전체 경로에 대해 일치하지만 파일 이름의 마지막 접미사만 일치하는 경우에는 문제가 되지 않습니다.)