我想对文件夹中的一堆 wav 文件重新采样。
我的脚本是这样的:
for f in *.wav; do sox “$f” -r 48000 “${f%%%.wav}.wav”; done
控制台给我这个错误:“sox FAIL formats: can't open input file `“90.wav”': No such file or directory” 等等,以及放置在该文件夹中的 300 个文件。
如何批量处理这些文件?为什么会给我这个错误?
非常感谢!
解决方案:
for i in *wav; do echo $i; sox $i -r 48000 ${i%%.wav}r.wav; done
最佳答案
总结:就是引号
问题在于双引号:
for f in *.wav; do sox “$f” -r 48000 “${f%%%.wav}.wav”; done
上面的双引号是非标准的。为了让 shell 正确处理它们,必须使用标准的 ASCII 引号:
for f in ./*.wav; do sox "$f" -r 48000 "${f%%%.wav}.wav"; done
顺便说一句,请注意 ${f%%%.wav}
会从输入文件名的末尾删除任何 %.wav
。 ${f%%%.wav}.wav
在删除所有 %.wav
后缀后将一个 .wav
添加回末尾。您可能还想要其他东西。
验证
根据问题,使用错误的引号字符,观察错误消息:
$ for f in *.wav; do sox “$f” -r 48000 “${f%%%.wav}.wav”; done
sox FAIL formats: can't open input file `“90.wav”': No such file or directory
请注意,错误消息中的文件名在文件名周围显示有两组引号。这是您根据问题中的错误消息看到的内容。外部单引号由 sox
提供。内部双引号是命令行上提供的有趣引号字符。因为它们是非标准字符,所以 shell 将它们留在原地并将它们传递给 sox
命令。
虽然文件 90.wav
存在,但名称为 “90.wav”
的文件不存在。因此,错误。
结论
坚持使用 shell 命令的标准 ASCII 字符。
如果 shell 命令是使用精美的文字处理编辑器输入的,该编辑器替换为打印漂亮但非标准的字符,则很容易发生此问题。正如 tripleee 指出的那样,从排版样式不当的网站进行复制和粘贴时也会发生这种情况。
关于linux - Debian下的sox批处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27264156/