Para o shell bash :
for file in *.avi; do
# use perl to transform the file name; could use 'sed -r' too
new_path=$(perl -pe 's|^(.+?)\.S0*(\d+)E0*(\d+)\.(.+)\.(\w+)$|$1/Season $2/Episode $3 - $4.$5|' <<< "$file")
# create directories if needed
mkdir -p "${new_path%/*}"
# move the file
mv -vn "$file" "$new_path"
done
Neste exemplo de expressão regular ( s|...|...| ):
-
$1é o nome do programa (tudo até ".S<num>E<num>"); -
$2e$3são números de temporada / episódio; -
$4é o título do episódio (tudo até a final "."); -
$5é a extensão do arquivo.
Se você deseja manter os zeros iniciais em números de temporada / episódio, substitua S0* e E0* apenas por S e E . Se você quiser processar outros tipos de arquivo, ajuste *.avi na primeira linha.
O Debian e o Ubuntu vêm com um script prename baseado em Perl que pode ser usado para isso, mas não cria novos diretórios automaticamente. É fácil modificá-lo para isso ; então você pode usar apenas prename 'the above regexp' *.avi .)