Usando sed
Existem várias maneiras de fazer isso. Se você quiser fazer isso enquanto aprende sed , tente:
$ filename='track name [artist].mp3'
$ newname=$(echo "$filename" | sed -E 's/(.*[^[:space:]])[[:space:]]*[[](.*)[]]/[] /')
$ echo "$newname"
[artist] track name.mp3
O comando de substituição do sed tem o formato s/old/new/ , em que old é uma expressão regular. Nesse caso, old consiste em partes:
-
(.*[^[:space:]])captura o nome da faixa. Como esse regex é cercado por parens, o nome da faixa é salvo em um grupo. A parte.*corresponde a qualquer coisa. O[^[:space:]]corresponde a qualquer espaço não branco. Colocando[^[:space:]]no final, garantimos que isso captura o nome da faixa, mas não o espaço em branco depois dela. -
[[:space:]]*[[]corresponde a espaços, se houver, que seguem o nome da faixa e o[que os segue. Porque[é um personagem sedativo, temos que escapar de alguma forma. Aqui, escapamos colocando-os entre colchetes como[[]. -
(.*)[]]corresponde ao texto até o final]no nome do arquivo. Os parênteses aqui fazem com que o nome do artista seja capturado como um segundo grupo.
A parte new do comando de substituição é [] . Isso coloca o segundo grupo (o nome do artista) primeiro e o primeiro grupo (o nome da faixa) em segundo lugar.
Atalho para renomear arquivos
Se seu objetivo for renomear arquivos, eu recomendaria o comando rename do pacote perl (às vezes chamado de prename ):
$ ls *mp3
track name [artist].mp3
$ prename 's/(.*[^[:space:]])[[:space:]]*[[](.*)[]]/[$2] $1/' *.mp3
$ ls *mp3
[artist] track name.mp3
prename usa um comando perl substitution que é muito semelhante ao do sed, mas faz referência aos grupos capturados não como e , mas como $1 e $2 .
NOTA: Alguns linuxes instalam um utilitário rename diferente incompatível e não funciona como acima.