Supprimez tous les types de files sauf un (ou plus)

J'ai essayé de find une command pour supprimer tous les files dans un dossier, mais pas une sorte de type de file. Mais je ne semble pas avoir de chance. Ce que j'ai essayé jusqu'à présent:

set extended_glob rm !(*.dmg) # this returns zsh:number expected rm ./^*.dmg # this returns no matches found 

La version de zsh que j'utilise est zsh 5.0.2 (x86_64-apple-darwin13.0.1) .

L'option extended_glob vous donne la propre syntaxe globale de zsh.

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

Vous pouvez définir l'option ksh_glob pour get des ksh_glob ksh . Attention, dans le cas courant où le motif négatif est la dernière chose du mot, zsh peut parsingr les parenthèses comme des qualifiants glob (ce n'est pas le cas en mode d'émulation ksh).

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

Vous pouvez utiliser find place de votre shell:

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

De l' 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. 

Si vous ne pouvez pas utiliser la find pour une raison quelconque, voici un moyen de le faire avec zsh (ou d'autres coquilles). zsh étant zsh , il y a probablement un moyen plus simple de le faire mais comme je suis un type bash voici ce que j'ai proposé:

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

Une autre façon de supprimer des files est de find , xargs et rm :

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