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

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

폴더의 모든 파일을 삭제하는 명령을 찾으려고 노력했지만 특정 파일 형식은 삭제하지 않았습니다. 그러나 나는 운이 좋지 않은 것 같습니다. 내가 지금까지 시도한 것 :

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).

답변1

이것extended_glob옵션은 zsh의 자체 확장 기능을 제공합니다.글로벌 문법.

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

확장자가 없는 파일(예 README: )이 삭제됩니다. 이러한 파일을 유지하려면 연산자를 사용하여 ~일치 항목을 제한할 수 있습니다.

setopt extended_glob
rm -- *.*~*.dmg

하위 디렉터리의 파일도 삭제하려면 다음을 사용할 수 있습니다.**재귀적 와일드카드에 사용됩니다. 통과하다. 글로벌 예선일반 파일로 일치를 제한하거나 ^/대신 .모든 비디렉토리(심볼릭 링크 포함)와 일치하는 데 사용하십시오. ( rm -r이렇게 하면 디렉토리와 모든 내용이 삭제되거나 디렉토리에 전혀 들어가지 않으므로 도움이 되지 않습니다.)

rm -- **/^*.(dmg|txt)(.)

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

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

답변2

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

답변3

파일을 삭제하는 또 다른 방법은 find, xargs및 다음을 사용하는 것입니다 rm.

find . -mindepth 1 -maxdepth 1 ! -name '*.dmg' -print0 | xargs -0 rm

답변4

find  path -mindepth 1 -maxdepth 1 -type f ! -name "*.dmg" -exec rm -vf {} \;

관련 정보