zsh에서 rm을 사용하여 제외하지 않는 이유는 무엇입니까?

zsh에서 rm을 사용하여 제외하지 않는 이유는 무엇입니까?

현재 디렉터리에 10개의 파일이 있습니다.

10test
1test
2test
3test
4test
5test
6test
7test
8test
9test

2test및를 제외한 모든 파일을 삭제하고 싶지만 3test실행한 명령이 rm !(2test|3test)작동하지 않습니다. 다음 오류가 발생합니다.

zsh: no matches found: !(2test|3test)

답변1

!(pattern)활성화된 경우 일치를 무효화하는 데 사용할 수 있는 kshglob 구문 입니다 .zsh^(pattern)extendedglob

setopt extendedglob
print -rl -- ^(2test|3test)

구문을 사용하려면 ksh다음을 활성화해야 합니다 kshglob.

setopt kshglob
print -rl -- !(2test|3test)

당신은 또한 사용할 수 있습니다설마/와는 별개로운영자:

setopt extendedglob
print -rl -- *test~[23]*

( *test또는로 시작하는 파일 제외).23

또한 이 옵션이 활성화되거나 s가 사용되지 않는 한 nobareglobqual후행 glob 그룹화 연산자는 glob 한정자와 충돌합니다 . 예를 들어, or는 전역 한정자로 처리됩니다. 또는 (비공개(명시적) 전역 한정자를 추가)가 필요합니다.|(...)!(foo)^(foo)foo^foo!(foo)(#q)(#q)

답변2

다음 을 제외한 모든 파일을 삭제할 setopt extendedglob수 있습니다 .^(2test|3test)2test3test

# setopt extendedglob
# touch {1..10}test
# rm ^(2test|3test)
# ls
2test 3test

!bash에서는 사용되지만 zsh에서는 사용되지 않습니다 ^.

답변3

깨끗한(비어 있는) zsh로 시작하세요.

 zsh -f 
 setopt extendedglob
 touch {1..10}test
 rm ^(2|3)test(.)

관련 정보