쉘의 extglob 쉘 옵션을 사용하여 find를 수행할 수 있는 방법이 있습니까?

쉘의 extglob 쉘 옵션을 사용하여 find를 수행할 수 있는 방법이 있습니까?

요컨대 이 두 파일을 찾아 계층구조를 아래로 내려가기 prefix.ext위해 본능적으로 이런 명령어를 쓴 것입니다.prefix_suffix.ext

find /some/path -type f -name 'prefix?(_suffix).zip'

하지만 작동하지 않습니다.

man find, 내부적으로 는 모드를 "쉘 모드"라고 부르기 때문에 어떤 모드를 사용해야 하는지 제어할 수 있는지, 특히 옵션을 사용할 수 있는지 -name patter궁금합니다 .extglob

답변1

find"기본" 쉘 패턴만 사용하십시오.POSIX에 명시된 바와 같이. -style glob을 지원하지 않습니다 extglob(GNU 구현에서는 fnmatch, 및GNU C 라이브러리 구현은 fnmatch확장 모드를 지원합니다.).

GNU를 사용하는 경우 find정규식을 사용하여 필터링할 수 있습니다.문서의 관련 부분세부:

-regex '.*/prefix\(_suffix\)?\.zip'

기본 정규식 유형을 사용하거나

-regextype posix-extended -regex '.*/prefix(_suffix)?\.zip'

ERE와 함께.

답변2

다른 사람들이 이미 지적했듯이 이 유틸리티는 기본적으로 쉘 및 기타(원래 쉘에서 상속됨 ) 에서 발견되는 확장된 글로빙 패턴을 find지원하지 않습니다 .bashksh

당신은 할 수사용bash다음 테스트를 실행하는 쉘 :

find /some/path -type f \
    -exec bash -O extglob -c '[[ ${1##*/} == prefix?(_suffix).zip ]]' bash {} \; \
    -print

bash그러나 조사하려는 각 파일에 대해 프로세스를 생성 해야 하므로 이는 매우 비효율적입니다 . 하나 이상의 일반 패턴을 사용하여 확장된 와일드카드 패턴을 재정의하는 것이 더 합리적입니다.

find /some/path -type f \
    \( -name prefix.zip -o -name prefix_suffix.zip \) \
    -print

이는 이식성이 뛰어나고 이해하기 쉽다는 장점이 있습니다.

답변3

또 다른 답변에서는 정규식을 언급했는데, 이로 인해 확실한 해결책이 나왔습니다. -regex대신 사용하세요 -name.

find /some/path -type f -regex '.*/prefix\(_suffix\)?\.zip'

조금 느려질 수도 있지만 그다지 많지 않을 수도 있습니다.

관련 정보