Lidar com o nome do arquivo com espaços dentro do script Bash

4

No meu script Bash eu tenho que lidar com nomes de arquivos com espaços. Estas são as linhas importantes dentro do meu script:

mp3file="/media/d/Music/zz_Hardcore/Sampler/Punk-O-Rama\ Vol.5\ \[MP3PRO\]/01\ -\ Nofx\ -\ Pump\ up\ the\ Valium.mp3"
echo "Command: mp3info -x `echo $mp3file`"
mp3info -x `echo $mp3file`

Infelizmente, o comando não funciona, porque o nome do arquivo é dividido:

mp3info: invalid option -- '\'
mp3info: invalid option -- '\'
Error opening MP3: /media/d/Music/zz_Hardcore/Sampler/Punk-O-Rama\: No such file or directory
Error opening MP3: Vol.5\: No such file or directory
Error opening MP3: \[MP3PRO\]/01\: No such file or directory
Error opening MP3: Nofx\: No such file or directory
Error opening MP3: Pump\: No such file or directory
Error opening MP3: up\: No such file or directory
Error opening MP3: the\: No such file or directory
Error opening MP3: Valium.mp3: No such file or directory

Eu também tentei adicionar um IFS personalizado como eu li em alguns fóruns:

SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
# Script like above
IFS=$SAVEIFS

Mas assim, estou recebendo o erro

Error opening MP3: /media/d/Music/zz_Hardcore/Sampler/Punk-O-Rama\ Vol.5\ \[MP3PRO\]/01\ -\ Nofx\ -\ Pump\ up\ the\ Valium.mp3: No such file or directory

Eu tentei um bom tempo agora, mas não consigo fazer meu script funcionar. O que é estranho é que, se eu estou executando o mesmo comando que meu script deve criar manualmente (ecoando-o dentro do meu script) no Shell, ele realmente funciona. Mas não dentro do meu roteiro. Alguma dica?

Ingo Fischer
fonte
1
Eu não sei o que é um retrocesso em IFSé suposto fazer (não importa sobre o retrocesso, eu só percebi que poderia ser qualquer personagem e ele está lá para preservar a nova linha que de outra forma obter caiu), mas você pode definir IFSsem o uso echo: IFS=$'\n'. Além disso, em um lugar você está usando backticks e outro que você está usando $(). A $()forma é preferida, uma vez que é mais legível, pode ser facilmente aninhado, etc
Dennis Williamson

Respostas:

9

Agrupe os nomes das variáveis ​​entre aspas:

mp3file="/media/music/Punk-O-Rama Vol.5 \[MP3PRO\]/01 - Nofx - Pump up the Valium.mp3"
echo "Command: mp3info -x \"$mp3file\""
mp3info -x "$mp3file"

Eu também removi os echocomandos supérfluos e escapar não é necessário.

Cry Havok
fonte
Obrigado, funciona! Não sei por que insistiu em preservar escapar tanto assim;)
Ingo Fischer