Script de tags id3 com id3v2 e sed

1

Estou tentando escrever um script para adicionar automaticamente informações de faixa e título à tag id3 de um arquivo mp3.

Neste ponto, eu pego o sed pegando as informações do nome do arquivo e formatando-o para caber no comando id3v2, mas ao obter um título com várias palavras, recebo o erro Couldn't stat file '<second word of title>' . Se eu apenas ecoar o comando id3v2 que está sendo executado, vejo o comando neste formato:

id3v2 -t Title\ Of\ Track -T 1 1_-_Title_Of_Track.mp3

Copiar / colar esse texto no terminal executa a marcação corretamente, mas obviamente não possui a automação pretendida do script. Então, aqui está o que o script que pretende automatizar o processo se parece com:

#!/bin/bash

for track in *.mp3 ; do
    id3v2 $(echo ${track} | sed -e 's/^\([1-9][0-9]*\)_-_\(.*\).mp3/-t  -T /' -e 's/_/\ /g') ${track}
done

Alguma idéia de por que o título é tratado como um único argumento quando digitado manualmente, mas não quando está em script?

    
por Christian Gibbons 21.08.2018 / 16:14

1 resposta

3

Com base nos comentários de Valentin B e mueh, eu descartei sed para a análise no script e, em vez disso, usei a manipulação de string do bash. Enquanto sed era bom para analisar vários dados e ordená-los em um único comando, a expansão de comando para usar o resultado dividiria a saída em "palavras" que seriam delimitadas por espaços, mesmo que os espaços fossem precedidos por barras invertidas ou cercado por citações.

Então, em vez de tentar construir todos os argumentos para id3v2 em uma única passagem com sed , ele foi dividido em parsing do número da faixa e do título separadamente usando a manipulação de string do bash. O resultado final:

for track in *.mp3 ; do
    track_num=${track%_-_*}
    title=${track#*_} ; title=${title%.mp3} ; title=${title//_/ }
    id3v2 -t "${title}" -T ${track_num} ${track}
done

Obrigado a mueh por explicar exatamente por que minha abordagem na questão não estava funcionando, e Valentin B por introduzir a manipulação de string do bash.

    
por 22.08.2018 / 05:25

Tags