하나 이상의 파일 형식을 제외한 모든 유형의 파일 형식 제거


20

폴더의 모든 파일을 제거하는 명령을 찾으려고 노력했지만 파일 유형이 아닙니다. 그러나 나는 운이없는 것 같습니다. 내가 지금까지 시도한 것 :

set extended_glob
rm !(*.dmg)
# this returns zsh:number expected

rm ./^*.dmg
# this returns no matches found 

내가 사용하는 zsh 버전은입니다 zsh 5.0.2 (x86_64-apple-darwin13.0.1).

답변:


22

extended_glob옵션은 zsh 자체 확장 glob 구문을 제공합니다 .

setopt extended_glob
rm -- ^*.dmg
rm -- ^*.(dmg|txt)

ksh globsksh_glob 를 얻 도록 옵션을 설정할 수 있습니다 . 음수 패턴이 단어의 마지막 항목 인 일반적인 경우 zsh는 괄호를 glob 한정자로 구문 분석 할 수 있습니다 (ksh 에뮬레이션 모드에서는이 작업을 수행하지 않음).

setopt ksh_glob
rm -- !(*.dmg|*.txt)
setopt no_bare_glob_qual
rm -- !(*.dmg)

작동하지 않는 것 같습니다. 내가 그것을 실행할 때 rm -r secrets/!(directory)그것을 요구 number expected하거나 때때로 그것은 나에게 준다event not found: directory
CMCDragonkai

@CMCDragonkai“번호 예상”은 ksh_glob옵션을 설정하지 않았 음을 나타냅니다 . “event not found : directory”는 bash를 실행하고 있음을 나타냅니다 ( !(…)구문을 이해 하지만 이후에만 shopt -s extglob).
Gilles 'SO- 악마 그만해'

zsh 쉘에있을 때 어떻게 bash를 실행할 수 있습니까?
CMCDragonkai 2018 년

나를 위해, setopt ksh_glob; echo !(a|b)동안 작동 setopt ksh_glob; echo !(a)하지 않습니다 ( "예상 된 숫자")
ThiefMaster

@ThiefMaster 나는 같은 문제가있었습니다. 버그입니까?
CodeTower

5

find쉘 대신 사용할 수 있습니다 .

find . -mindepth 1 -maxdepth 1 ! -name "*.dmg" -delete

보낸 사람 man find:

   ! expr True  if  expr  is false.  This character will also usually need
          protection from interpretation by the shell.
   -name pattern
          Base of file name (the path with the leading directories removed)
          matches shell pattern pattern. 
   -delete
          Delete  files; true if removal succeeded.  If the removal failed,
          an error message is issued.  If -delete fails, find's exit status
          will be nonzero (when  it eventually exits).  Use of -delete 
          automatically turns on the -depth option.

find어떤 이유로 든 사용할 수없는 경우 여기 zsh(또는 다른 껍질)로 사용하는 방법이 있습니다 . zshzsh이이 일을 간단한 방법은 아마도하지만 난 해요 때문에, bash사람이 내가 생각 해낸 것입니다 :

for file in *; do if [[ ! "$file" == *.dmg ]]; then rm $file; fi; done

불행히도, 내 Mac에서 find를 사용할 때마다 통지없이 현재 zsh 세션을 종료합니다. 같은 문제가 있습니까? find [Process completed]
Dzung Nguyen

1
@nXqd없이 업데이트 된 답변을 참조하십시오 find. 그래도 문제에 관한 질문을 게시하는 것이 좋습니다 find. 그렇다면의 출력을 포함하십시오 type -a find.
terdon

1
bash에서도 더 간단한 해결책이 있습니다 : rm !(*.dmg), after shopt -s extglob.
Gilles 'SO- 악마 그만

셸에서 디버깅 팁을 주셔서 감사합니다. 그것의 출력은 올바른 것 같습니다 :find is a shell function find is /usr/bin/find
Dzung Nguyen

@nXqd는 올바르지 않습니다. 쉘 함수가 아니어야합니다 /usr/bin/find. findbash 구성 파일 중 하나에 정의 된 함수가 있습니다. OSX를 사용하고 있기 때문에 아마도 그렇습니다 ~/.profile.
terdon

3

파일을 제거하는 또 다른 방법은 함께 find, xargs그리고 rm:

find . -mindepth 1 -maxdepth 1 ! -name '*.dmg' -print0 | xargs -0 rm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.