Citando man 7 glob :
An expression "[!...]" matches a single character, namely any character
that is not matched by the expression obtained by removing the first '!' from it.
(Thus, "[!]a-]" matches any single character except ']', 'a' and '-'.)
Ênfase na parte de caractere único aqui, [] não pode ser usado para strings inteiras no Bash Pattern Matching.
bash pode ser usada para combinar strings, mas não há como (Eu sei) para negá-los. Por exemplo,
1.{gif,csv,mp3}
é expandido para
1.gif 1.csv 1.mp3
não importa se esses arquivos existem.
Como o wchargin apontou, shopt pode ser usado para habilitar operadores estendidos de correspondência de padrões, sendo um deles !() . Depois de executar shopt -s extglob , por exemplo,
1.!(gif|csv|mp3)
é expandido para
1.jpg 1.bmp 1.png
se esses arquivos existirem no diretório atual. Para mais informações, leia man bash (seção EXPANSÃO / Expansão do nome do caminho) e Expansão do nome do tráfego (globbing) .
Para o que você está tentando fazer, eu sempre uso find , que oferece a negação e muito mais, por exemplo. da seguinte maneira:
find . -maxdepth 1 -type f ! -name "*.gif" -a ! -name "*.csv" -a ! -name "*.mp3"
Isso apenas lista as descobertas, se você quiser removê-las basta anexar a opção -delete ao final do comando. Como sempre com a remoção de ações: Sempre verifique cuidadosamente primeiro .
find oferece uma tonelada de opções úteis muito bem explicadas por man find .