Isso deve funcionar:
for i in *mp3; do rename 's/(.+?)_(.+?)_(.+?)-(.+?)-(.+?)_(.+?)-(.+?)-(.+?).mp3/$8-$7-$6_$3-$4-$5_$1_$2.mp3/' "$i"; done
Os parênteses capturam padrões. A 1ª correspondência capturada é $1 , o 2º $2 etc. Então, o comando acima:
- procurará tudo até o primeiro
_ -
.+?significa corresponder ao padrão mais curto possível devido ao?, - então tudo até o 2º
_etc. - e renomeia de acordo.
Eu testei com:
$ touch [name]_[phonenumber]_HH-mm-ss_dd-MM-yyyy.mp3
$ ls
[name]_[phonenumber]_HH-mm-ss_dd-MM-yyyy.mp3
$ for i in *mp3; do rename 's/(.+?)_(.+?)_(.+?)-(.+?)-(.+?)_(.+?)-(.+?)-(.+?).mp3/$8-$7-$6_$3-$4-$5_$1_$2.mp3/' "$i"; done
$ ls
yyyy-MM-dd_HH-mm-ss_[name]_[phonenumber].mp3