将包含空格的shell变量作为参数传递

将包含空格的shell变量作为参数传递,shell,ffmpeg,Shell,Ffmpeg,我知道已经有很多这样的问题了,但我的情况很独特,到目前为止,没有一个对我有帮助 我正在写一个脚本,将重新格式化我的(标记不好的)音乐库。它目前的形式是音乐/流派/艺术家/专辑/###-Title.wav 在音乐目录中,我运行script1,它调用find-name“*.wav”-exec script2{}${other_args}。Script2解析变量的路径,如果不存在,则创建相应的输出目录,然后调用ffmpeg进行压缩 例如:($sourcefilepath包含来自find的{}) 如果我

我知道已经有很多这样的问题了,但我的情况很独特,到目前为止,没有一个对我有帮助

我正在写一个脚本,将重新格式化我的(标记不好的)音乐库。它目前的形式是音乐/流派/艺术家/专辑/###-Title.wav

在音乐目录中,我运行script1,它调用
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