O @ChrisDown forneceu uma bash solution que leva em conta a diferença de arquivos e diretórios, e também se não há arquivo para remover.
Dado que rm falharia, no entanto, nessas situações, o comando poderia ser simplificado como (ainda com bash ):
shopt -s extglob nocaseglob
rm -- !(*.bmp|*.wav|*.png)
Lembre-se de redefinir as duas opções de shell para seus valores padrão. No meu caso extglob já está definido em shells interativos, então eu só preciso
shopt -u nocaseglob
Ou execute esses dois comandos em um subshell:
(shopt -s extglob nocaseglob
rm -- !(*.bmp|*.wav|*.png))
Se você gostaria de ver com antecedência quais arquivos serão removidos, basta substituir o rm por echo .
Se você quiser que os arquivos ocultos também sejam removidos, adicione a opção dotglob .