Eu vim com esse ótimo comando simples e fácil:
rm !(a.txt)
você pode usar! como uma negação
Teste a glob com eco primeiro, por exemplo,
echo !(a.txt)
Se isso não funcionar, para bash você pode precisar ativar isso com
shopt -s extglob
Se você quiser manter os dois a.txt e b.txt , use !(a.txt|b.txt) ou !([ab].txt) .
Editar:
para fazer rm funcionar recursivamente, basta adicionar -r like
rm -r !(a.txt)
e também, está trabalhando com pasta. só precisa mudar o nome para o nome do dir, como por a_dir
rm -r !(a_dir)