Você pode usar o sinal -delete de find (primeiro teste com -ls )
find -not -name "*.c" -delete
Se você não quiser usar find , mas apenas arquivos no diretório atual, você pode fazer
rm !(*.c)
Certifique-se, em bash , de que com shopt -s extglob a globbing correta está definida. Além disso, se você tiver globstar set ( shopt -s globstar ), você pode agir recursivamente (para bash versões acima de 4):
rm **/!(*.c)