将包含空格的shell变量作为参数传递
我知道已经有很多这样的问题了,但我的情况很独特,到目前为止,没有一个对我有帮助 我正在写一个脚本,将重新格式化我的(标记不好的)音乐库。它目前的形式是音乐/流派/艺术家/专辑/###-Title.wav 在音乐目录中,我运行script1,它调用将包含空格的shell变量作为参数传递,shell,ffmpeg,Shell,Ffmpeg,我知道已经有很多这样的问题了,但我的情况很独特,到目前为止,没有一个对我有帮助 我正在写一个脚本,将重新格式化我的(标记不好的)音乐库。它目前的形式是音乐/流派/艺术家/专辑/###-Title.wav 在音乐目录中,我运行script1,它调用find-name“*.wav”-exec script2{}${other_args}。Script2解析变量的路径,如果不存在,则创建相应的输出目录,然后调用ffmpeg进行压缩 例如:($sourcefilepath包含来自find的{}) 如果我
find-name“*.wav”-exec script2{}${other_args}
。Script2解析变量的路径,如果不存在,则创建相应的输出目录,然后调用ffmpeg进行压缩
例如:($sourcefilepath包含来自find的{})
如果我的文件名或路径不包含空格,那么它就像一个符咒
如果它包含空格,ffmpeg将失败,并出现以下错误:
蓝调/乡村蓝调/节奏,乡村蓝调/08娜塔莉·科尔和丽巴
自从我爱上你以来,我就一直这样。wav:没有这样的文件或目录
注意:这是它找不到的源文件。输出文件似乎工作正常,即使有空格。这不是我正在运行的完整命令(它也有一些-metadata标志,但似乎工作正常。我正在用上面编写的命令进行调试)
这里有趣的是ffmpeg没有将$sourcefilepath解释为两个参数,它只是找不到我指定的文件。从音乐目录中运行以下命令是有效的
ffmpeg -i Blues/Country\ Blues/Rhythm\,\ Country\ And\ Blues/08-Natalie\ Cole\ \&\ Reba\ McEntire\ \ \ Since\ I\ Fell\ For\ You.wav output.flac
我被困在这里了。web上的其他信息包括获取一个命令,以将空格作为一个参数而不是多个参数来查看变量。我似乎已经这样做了,但ffmpeg现在找不到我的文件
通常我只使用find-name“*.wav”-execffmpeg-I{}${args}\代码>但我需要处理文件路径以提取元数据
我对shell脚本相当陌生;有人知道这里发生了什么吗?我的灵力表明,在你的代码中的某个点上,你在做一些事情,大致如下:
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
然后用单个空格连接参数。最终的结果是多个空格合并成一个空格。你能在你的脚本中,验证它是否仍然显示相同的问题,并将其添加到你的问题中吗?你的精神力量是正确的;我将变量传递给sed,并以这种方式剪切,以处理路径。非常感谢@JulianDelphiki为了您的方便,会自动指出这一点和其他问题。
Reba McEntire Since I fell
Reba McEntire Since I fell