linux - Debian下的sox批处理

标签 linux bash batch-processing sox

我想对文件夹中的一堆 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/

相关文章:

linux - 确定闪存驱动器上有多少个分区

python - python中奇怪的换行符错误

regex - awk regex 我怎样才能匹配或捕获这个字符串

bash - Tmux 窗口标题不断重命名

java - Mailchimp API 帖子成员(member)批量操作

linux - 如何按顺序打印包含某些字符串的行?

c - Linux 内核 ftrace irqsoff 跟踪器生成奇怪的输出

bash - 实时修改shell stdout

java - Spring 批处理中的验证步骤

node.js - Kinesis Lambda 消费者最小批量大小