我知道这些问题已经存在很多,但我的情况非常独特,到目前为止他们都没有帮助过我。
我正在编写一个脚本,它将重新格式化我(标记不佳的)音乐库。它目前采用音乐/流派/艺术家/专辑/ ## - Title.wav的形式。
在Music目录中,我运行我的script1,它调用find -name "*.wav" -exec script2 {} ${other_args}
。 Script2解析变量的路径,如果它不存在则创建适当的输出目录,然后调用ffmpeg进行压缩。
ex :( $ sourcefilepath包含来自find的{})
ffmpeg -i "$sourcefilepath" "$path/$to/$outfile.$extension"
如果我的文件名或路径不包含空格,则它就像魅力一样。
如果它包含空格,则ffmpeg失败,出现以下错误:
蓝调/乡村蓝调/节奏,乡村和布鲁斯/ 08-Natalie Cole&雷巴 McEntire因为我为You.wav而崩溃:没有这样的文件或目录
注意:这是它找不到的源文件。即使有空格,输出文件似乎也能正常工作。这不是我正在运行的完整命令(它也有一些-metadata标志,但它似乎也正常工作。我正在调试我上面写的命令。)
这里有趣的是ffmpeg不会将$ sourcefilepath解释为两个args,它只是找不到我指定的文件。从音乐目录运行以下内容。
ffmpeg -i Blues/Country\ Blues/Rhythm\,\ Country\ And\ Blues/08-Natalie\ Cole\ \&\ Reba\ McEntire\ \ \ Since\ I\ Fell\ For\ You.wav output.flac
我有点被困在这里。 Web上的其他信息涉及获取命令以查看具有空格的变量作为一个arg而不是多个。我似乎已经这样做了,但现在ffmpeg找不到我的文件了。
通常我只使用find -name "*.wav" -exec ffmpeg -i {} ${args} \;
,但我需要处理文件路径以提取元数据。
我是shell脚本的新手;有谁知道这里发生了什么?
答案 0 :(得分:2)
我的精神力量表明,在您的代码中的某些时刻,您可以按照以下方式执行某些操作:
something=$(echo $filename | something)
这应该是:
something=$(echo "$filename" | something)
这是一个脚本,展示了这个问题的原因:
#!/bin/sh
filename="Reba McEntire Since I fell"
echo "$filename" # Correct, quoted
echo $filename # Incorrect, unquoted
输出:
Reba McEntire Since I fell
Reba McEntire Since I fell
您会注意到
这是由于不加引号的变量扩展正在进行单词分裂。 echo
然后将参数与单个空格连接起来。最终结果是多个空格合并为一个空格。