Com o Perl rename (*) :
rename 's/^(.*) - (.*)(\..*)$/$2 - $1$3/' *.avi
ou, se você quiser ser mais rigoroso sobre o código:
rename 's/^(.*) - ([a-zA-Z]{2}\d{2}-\d{4})(\..*)$/$2 - $1$3/' *.avi
Isso deve funcionar mesmo com nomes como foo - bar - AB12-1234.avi , já que o primeiro .* corresponde ao <space><dash><space> final.
(* veja: O que há com todas as renomeações: prename, rename, rename de arquivo? )
Ou similarmente no Bash:
for f in *.avi ; do
if [[ "$f" =~ ^(.*)\ -\ (.*)(\..*)$ ]]; then
mv "$f" "${BASH_REMATCH[2]} - ${BASH_REMATCH[1]}${BASH_REMATCH[3]}"
fi
done
Resumidamente, os regexes são divididos em
^ start of string
( ) capture group
.* any amount of anything
\. a literal dot
$ end of string
A maioria dos caracteres regulares combina com eles, embora você precise escapar de espaços com barras invertidas no Bash (como acima). O conteúdo dos grupos de captura aparece em ordem em $1 , $2 etc no Perl e em ${BASH_REMATCH[1]} , ${BASH_REMATCH[2]} etc no Bash.