현재 디렉터리에 10개의 파일이 있습니다.
10test
1test
2test
3test
4test
5test
6test
7test
8test
9test
2test
및를 제외한 모든 파일을 삭제하고 싶지만 3test
실행한 명령이 rm !(2test|3test)
작동하지 않습니다. 다음 오류가 발생합니다.
zsh: no matches found: !(2test|3test)
답변1
!(pattern)
활성화된 경우 일치를 무효화하는 데 사용할 수 있는 ksh
glob 구문 입니다 .zsh
^(pattern)
extendedglob
setopt extendedglob
print -rl -- ^(2test|3test)
구문을 사용하려면 ksh
다음을 활성화해야 합니다 kshglob
.
setopt kshglob
print -rl -- !(2test|3test)
당신은 또한 사용할 수 있습니다설마/와는 별개로운영자:
setopt extendedglob
print -rl -- *test~[23]*
( *test
또는로 시작하는 파일 제외).2
3
또한 이 옵션이 활성화되거나 s가 사용되지 않는 한 nobareglobqual
후행 glob 그룹화 연산자는 glob 한정자와 충돌합니다 . 예를 들어, or는 전역 한정자로 처리됩니다. 또는 (비공개(명시적) 전역 한정자를 추가)가 필요합니다.|
(...)
!(foo)
^(foo)
foo
^foo
!(foo)(#q)
(#q)
답변2
다음 을 제외한 모든 파일을 삭제할 setopt extendedglob
수 있습니다 .^(2test|3test)
2test
3test
# 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(.)