Use printf
, com uma string de formato que especifica a largura do campo e o preenchimento com zero para os inteiros, por exemplo,
printf -v newname 'S%02dE%02d%s' "$((10#${BASH_REMATCH[2]}))" "$((10#${BASH_REMATCH[3]}))" "${BASH_REMATCH[4]}"
Observe o uso de $((10#${BASH_REMATCH[n]}))
para forçar a avaliação decimal em casos como 09
Teste (modifiquei sua expressão regular ligeiramente BTW):
reg='^([^0-9]*)([0-9][0-9]*)[^0-9]*([0-9][0-9]*)(\....)$'
for filename in *.mp4; do
if [[ $filename =~ $reg ]]; then
printf -v newname 'S%02dE%02d%s' "$((10#${BASH_REMATCH[2]}))" "$((10#${BASH_REMATCH[3]}))" "${BASH_REMATCH[4]}"
echo mv "$filename" "$newname"
fi
done
mv Some Series01.Episode02.mp4 S01E02.mp4
mv SomeSeries1Episode03.mp4 S01E03.mp4
mv Some_Series.1_Episode.1.mp4 S01E01.mp4
Possivelmente mais robusto seria usar o regex somente para coincidir com as duas primeiras seqüências de dígitos, e usar a substituição de parâmetros do shell para manipular a extensão:
reg='([0-9][0-9]*)[^0-9]*([0-9][0-9]*)'
for filename in *.mp4 *.mkv; do
name="${filename%.*}"
ext="${filename##*.}"
if [[ $name =~ $reg ]]; then
printf -v newname 'S%02dE%02d.%s' "$((10#${BASH_REMATCH[1]}))" "$((10#${BASH_REMATCH[2]}))" "${ext}"
echo mv "$filename" "$newname"
fi
done
mv Some Series01.Episode02.mp4 S01E02.mp4
mv SomeSeries09Episode10.mp4 S09E10.mp4
mv SomeSeries1Episode03.mp4 S01E03.mp4
mv Some_Series.1_Episode.1.mp4 S01E01.mp4
mv Breaking.Bad.S01E01.576p.BluRay.DD5.1.x264-HiSD.mkv S01E01.mkv
Como alternativa, se o seu sistema tiver o comando rename
/ prename
baseado em perl, você poderá fazer algo como
prename -vn -- 's/.*(\d+).*(\d+)/sprintf "S%02dE%02d.mp4", $1, $2/e' *.mp4