이(확장된) 와일드카드가 제외하려는 파일 이름과 일치하는 이유는 무엇입니까?

이(확장된) 와일드카드가 제외하려는 파일 이름과 일치하는 이유는 무엇입니까?

왜?'myscript.txt'명령을 실행하면 다음과 같이 표시됩니다.

$ ls !(my)*.txt
myscript.txt
hey.txt

$ ls !(my)*.txt마찬가지로 bash는 and 를 어떻게 해석합니까 $ ls !(my*).txt?

답변1

!(my)*.txtmyscript.txt때문에 일치

  • !(my)빈 문자열 일치
  • *성냥myscript
  • .txt성냥.txt

( !(my)빈 문자열과 일치 myscript하거나...과 일치합니다.)*!(my)m*yscript

!(my*).txt.txt로 끝나지만 로 시작하지 않는 파일 이름을 일치시키려면 이 작업을 수행해야 합니다 my.

이는 !(*)ksh 관련 연산자입니다. 옵션이 켜져 있는 bash경우에만 해당 옵션이 켜져 있는 경우에만 해당 옵션도 지원됩니다.extglobzshkshglob

zsh또한 자체 extendedglobs와 ^부정 연산자 가 있습니다.~ 와는 별개로/설마운영자:

set -o extendedglob
ls -ld -- (^my*).txt
ls -ld -- *.txt~my*

이것와는 별개로/설마연산자는 ksh93다음과 같은 방법으로 구현할 수 있습니다.

ls -ld -- @(*.txt&!(my*))

또는 bash -O extglob이전 버전의 ksh와 함께 사용

ls -ld -- !(!(*.txt)|my*)

그러나 전체 glob 패턴에 대한 최종 필터로 사용되는 의 연산자 zsh와 는 다르지만 glob의 개별 경로 구성 요소에서만 작동할 수 있습니다(예: 확장에서 제외 ) .~!(...)@(...)*/b*~f*rfoo/bar*/b*

관련 정보