Usando sed para mover parte do nome do arquivo

0

Eu tenho alguns arquivos de música que são nomeados como 'nome da faixa [artista]'.

Eu quero que eles sejam '[artista] trackname', e por isso preciso mover os colchetes e o que está neles para o início do arquivo.

Acabei de descobrir sed, mas não tenho inteligência para entender como usá-lo para fazer o que eu quero.

    
por gulliver 15.05.2016 / 08:43

1 resposta

0

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:

  1. (.*[^[: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.

  2. [[: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 [[] .

  3. (.*)[]] 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.

    
por 15.05.2016 / 09:33

Tags