Isso não tem nada a ver com mv , mas é um recurso bash , citando man bash :
!(f1) corresponde a f2 f3 no seu exemplo, então você está fazendo o seguinte:
mv -t f3/ f2 f3 f2
Para alcançar seu objetivo, você deve preferir:
mv -t f3/ !(f[13]) # or !(f1|f3)
Esta expressão corresponde a tudo, exceto f1 e f3 .
Isso também funciona com * , ? e […] :
$ ls
e1 e2 e3 f1 f2 f3
$ ls !(e*|?[12])
f3