요컨대 이 두 파일을 찾아 계층구조를 아래로 내려가기 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
지원하지 않습니다 .bash
ksh
당신은 할 수사용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'
조금 느려질 수도 있지만 그다지 많지 않을 수도 있습니다.