【问题标题】:Sox batch process under DebianDebian下的sox批处理
【发布时间】:2015-01-31 13:40:03
【问题描述】:

我想对文件夹中的一堆 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; ...
  • 好像有 1 个% 太多了,但是如果你写"${f%%.wav}.wav" 甚至"${f%.wav}.wav",这就没用了……你不能在你读的时候覆盖你的文件它!
  • 三个百分号是怎么回事?我见过一两个,但不是三个。简短的实验表明,第三个是按字面意思使用的,在 Bash 的东部。
  • @techno 是的,它是偶然工作的,实际上以 09.wav.wav 作为输出文件结束,因为替换没有做任何事情。

标签: linux bash batch-processing sox


【解决方案1】:

总结:就是引号

问题在于双引号:

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 指出的那样,从印刷样式不当的网站复制和粘贴时也会发生这种情况。

【讨论】:

  • ... 或从一个愚蠢地将印刷样式应用于代码的博客中复制/粘贴。
  • @tripleee 很棒的想法:我刚刚将它添加到答案中。
  • 我有一个脚本可以很好地使用 ImageMagick,而不是来自网站。我的驱动器上有一个文本文件中的脚本。感谢您的回答约翰。
  • @DaNoiseMan 你用普通的 ASCII 双引号再试一次吗?如果您这样做了但没有成功,您会收到什么错误消息?
  • 这成功了:for i in *wav;回声 $i; sox $i -r 48000 ${i%%.wav}r.wav;再次感谢约翰!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 2010-12-17
相关资源
最近更新 更多