escape strings dentro da variável retornada entre aspas simples

0

Eu tenho um número de arquivos mp3 sem nomes de arquivos corretos. O que eu gostaria de fazer é criar um script que leia o artista e o título da tag mp3 e renomeie o arquivo de acordo com a tag.

O script abaixo contém alguns ecos para fins de depuração:

#!/bin/bash

src=$1
dst=$2

for filename in ${src}/*

do
echo $filename
artist='id3v2 -R $filename |grep TPE|cut -d':' -f2'
nospace_artist="$(echo -e "${artist}" | sed -e 's/^[[:space:]]*//')"
trim_artist='printf "%q" "$nospace_artist"'

title='id3v2 -R $filename |grep TIT2|cut -d':' -f2'
nospace_title="$(echo -e "${title}" | sed -e 's/^[[:space:]]*//')"
trim_title='printf "%q" "$nospace_title"'

echo $artist
echo $nospace_artist
echo $trim_artist

echo $title
echo $nospace_title
echo $trim_title

fullpath=${trim_artist}-${trim_title}.mp3
echo $fullpath > cmd.txt

final_file='cat cmd.txt'
echo $final_file
cp $filename ${dst}/$final_file
done

Muito brevemente, o que o script acima faz é usar a ferramenta id3v2 para obter a tag mp3. Em seguida, analisa a saída para armazenar o artista e o título em variáveis separadas. Além disso, remove os espaços à direita e, em seguida, usando "printf% q", ele escapa de todos os espaços encontrados na sequência de artista / título.

Finalmente, as variáveis são usadas com o comando cp para copiar o arquivo com o título apropriado, mas o cp falha. Ele falha devido ao fato de que uma das variáveis usadas para o nome do arquivo é ecoada em aspas simples, portanto, o escape dos espaços não é analisado. Aqui está minha saída:

bash -x tager.sh untaged rdy
+ src=untaged
+ dst=rdy
+ for filename in '${src}/*'
+ echo untaged/f1959864.mp3
untaged/f1959864.mp3
++ id3v2 -R untaged/f1959864.mp3
++ grep TPE
++ cut -d: -f2
+ artist=' regurgitator'
++ echo -e ' regurgitator'
++ sed -e 's/^[[:space:]]*//'
+ nospace_artist=regurgitator
++ printf %q regurgitator
+ trim_artist=regurgitator
++ id3v2 -R untaged/f1959864.mp3
++ grep TIT2
++ cut -d: -f2
+ title=' polyester girl'
++ echo -e ' polyester girl'
++ sed -e 's/^[[:space:]]*//'
+ nospace_title='polyester girl'
++ printf %q 'polyester girl'
+ trim_title='polyester\ girl'
+ echo regurgitator
regurgitator
+ echo regurgitator
regurgitator
+ echo regurgitator
regurgitator
+ echo polyester girl
polyester girl
+ echo polyester girl
polyester girl
+ echo 'polyester\' girl
polyester\ girl
+ fullpath='regurgitator-polyester\ girl.mp3'
+ echo 'regurgitator-polyester\' girl.mp3
++ cat cmd.txt
+ final_file='regurgitator-polyester\ girl.mp3'
+ echo 'regurgitator-polyester\' girl.mp3
regurgitator-polyester\ girl.mp3
+ cp untaged/f1959864.mp3 'rdy/regurgitator-polyester\' girl.mp3
cp: target ‘girl.mp3’ is not a directory

O que eu não entendo é isto:

+ final_file='regurgitator-polyester\ girl.mp3'
+ echo 'regurgitator-polyester\' girl.mp3
regurgitator-polyester\ girl.mp3
+ cp untaged/f1959864.mp3 'rdy/regurgitator-polyester\' girl.mp3

A variável "final_file" contém a string que eu preciso. Quando faço eco da variável, na tela ela aparece como eu desejo, mas, quando usada no shell, ela se expande entre aspas duplas, fazendo com que meu cp falhe.

    
por giomanda 14.05.2016 / 20:49

0 respostas