sed pode conseguir isso em uma única linha, embora de maneira bastante complicada.
ls | sed 's/\(.*\)\(-.*\)/mv \"&\" \".mp3\"/' | bash
Primeiro, lista os arquivos no diretório atual (assumindo que todos os arquivos que você deseja renomear estão no diretório atual) e, em seguida, usa o comando s / regex / replacement do sed para gerar um comando sensitivo mv que é canalizado para o bash que executa. Isso pressupõe que todos os seus arquivos sejam do tipo "A-C.mp3" ou "A-B-C.mp3". Veja como funciona:
A parte regex do comando sed é
\(.*\)\(-.*\)
isso "agrupa" o nome em dois agrupamentos (delimitados por parênteses com escape): um correspondente ". *" (qualquer número de qualquer caractere) e outro correspondente "-. *", um traço seguido por qualquer número de qualquer caractere . Observe que isso corresponde ao nome do arquivo inteiro (em dois grupos). Observe também que, como o regex "ganancioso" é usado, o primeiro grupo corresponderá a "A" em "AC.mp3" e "A - B", não apenas "A", em "A - BC.mp3", conforme desejado.
A parte de substituição do comando sed é
mv \"&\" \".mp3\"/
Observe que um & amp; o caracter instrui o sed a inserir o padrão inteiro que corresponde ao regex, neste caso, o nome inteiro do arquivo, e o \ 1 instrui o sed para inserir a parte do nome do arquivo que correspondeu ao primeiro agrupamento ". *". Esses dois são combinados com um mv precedente e um .mp3 à direita, com aspas escapadas para produzir um comando de renomeação sensato. Por exemplo, para "A - B-C.mp3", o comando full sed produzirá:
mv "A - B-C.mp3" "A - B.mp3"
E finalmente tudo isso é canalizado para o bash, que executa o comando mv (rename).