No bash, isso pode ser feito da seguinte forma:
for i in *; do echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3 }' ; done
Este comando primeiro encontra todos os arquivos no diretório atual e, em seguida, alimenta esses nomes (assume sem verificar que há três sublinhados e um. nesses nomes de arquivo) para awk, que os reorganiza a ordem que você deseja.
A única parte complicada é -F'[_.]'
A opção -F' '
é usada para identificar o delimitador entre diferentes campos e, neste último caso, o delimitador assume seu valor padrão, um espaço. Mas a opção -F'[_.]'
define uma classe de caractere de elementos intercambiáveis, neste caso, sublinhado e ponto, que podem ser usados à vontade como delimitadores.
Editar:
Ok, como isso funciona, sem realmente mover nada, agora podemos implementar o ato real de renomear os arquivos:
for i in *; do ni=$(echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3"."$5 }') && mv "$i" "$ni" ; done