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.