我正在寻找一种自动文件转换的方法。我正在使用 Ubuntu 虚拟机,通过它我可以访问 Windows 安装。正常的语法应该是:
ffmpeg -i file.mp4 file.mp3
所以这就是我想做的:
ls | while read i; do echo ffmpeg -i \"$i\" \"${i/mp4/mp3}\"; done
正如你所看到的,我添加了“echo”来首先查看生成的命令,这就是我得到的:
ffmpeg -i "Accepting Amendments.mp4" "Accepting Amendments.mp3"
正如您所看到的,文件名可能有空格,所以我试图转义它们。但是,当我删除“echo”时,此命令不起作用。发生的情况只是进行了一些转换,并且我收到了带有分割文件名的错误消息,例如“接受修正案.mp4”例如。所以基本上第一个 ffmpeg 命令运行良好,然后第二个命令失败,依此类推。
我注意到,当我运行命令时ls
,我得到的文件名带有单引号,但是当我自己创建文件时,没有引号。
$ls
'Accepting Amendments.mp4'
$touch test
$ls
'Accepting Amendments.mp4'
test
这可能是问题所在吗?
答案1
不,问题是(通过使用\"
)您告诉ffmpeg
要转换文件"Accepting Amendments.mp4"
,名称中包含引号。该文件不存在,因此ffmpeg
失败。您真正想要做的是使用 shell 解释为“不拆分包含的值”的未转义引号:ffmpeg -i "$i" "${i/mp4/mp3}"
除了,而不是管道 ls 的输出你可以/应该拥有自己的 shell 循环:
for i in *.mp4; do ffmpeg -i "$i" "${i/mp4/mp3}"; done
但这ffmpeg
仍然不能正常工作,因为它由于某种原因从标准输入读取似乎以这种方式吞掉了文件名中的一些字符。该-nostdin
标志有助于:
for i in *.mp4; do ffmpeg -nostdin -i "$i" "${i/mp4/mp3}"; done
(您在输出中看到的单引号ls
是由包含例如空格的文件名版本添加的ls
,因此您可以简单地将命令行上的输出作为另一个程序的参数。这与创建者无关文件,您只是没有触发名为 的文件的行为test
。)