폴더의 모든 파일을 삭제하는 명령을 찾으려고 노력했지만 특정 파일 형식은 삭제하지 않았습니다. 그러나 나는 운이 좋지 않은 것 같습니다. 내가 지금까지 시도한 것 :
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
(또는 다른 셸)을 사용하여 이를 수행할 수 있습니다. zsh
예 zsh
, 아마도 더 쉬운 방법이 있을 것입니다. 하지만 저는 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 {} \;