Você pode usar find
:
find . -type f ! -name '*.txt' -delete
Os recursos de globbing estendido do bash:
shopt -s extglob
rm *.!(txt)
Ou em zsh:
setopt extendedglob
rm *~*.txt(.)
# || ^^^ Only plain files
# ||^^^^^ files ending in ".txt"
# | \Except
# \Everything