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.