我在目录中有多个文件是.aiff格式,我想使用SoX将它们转换为.wav。我在this网站上尝试过代码,如下所示
theFiles = `/Users/me/RainbowAiff/*.aiff`;
for eachFile in $theFiles; do v1=${eachFile%*.aiff};
oldFile="$v1.aiff"; newFile = "$v1.wav";
echo oldFile $oldFile; echo newFile $newFile; sox $oldFile $newFile; done
和this网站,如下
for i in `/Users/me/RainbowAiff/ *.aiff`; do echo -e "$i"; sox $i $i.wav; echo -e "$i.wav"; done;
但我在两个实例中都收到一条错误消息,指出“无法执行二进制文件”。可能是这个错误的根源是什么?
不兼容的二进制文件导致此错误,see this question。
如果file sox
和uname -a
命令的输出告诉二进制文件和操作系统之间存在差异,即x86与ARM,则需要为SoX找到正确的二进制文件。虽然自2015年以来没有SoX版本,但请查看this和this以查找与您的系统兼容的版本。
该问题还与sox的文件属性有关。为了给它提供可执行属性,只需转到sox所在的文件夹并运行chmod +x sox
命令(首先需要root访问权限)。
你联系到的两个片段对我来说使用ls
和echo
看起来有点粗略。
事实上,echo -e
可能会给你语法错误,因为OSX(BSD)echo
没有-e
选项。 (键入man echo
进入终端看)。
我冒昧地组装了一个基于find
及其-exec
选项的替代单线程。
find -E . -maxdepth 1 -iregex '.*\.(aif|aiff)' -exec bash -c '$0 "$1" "${1%.*}.wav"' sox {} \;
解释一下:
find
:可以找到任何东西-E
:启用extended regex *.
:从当前工作目录开始。可以用相对或绝对路径替换-maxdepth 1
:仅在第一个目录层中查找。将1替换为2还可以在文件夹中找到文件,使用3还可以在文件夹中找到文件夹中的文件...
删除此选项将启用完全递归(一直查找文件)-iregex
:使用不区分大小写的正则表达式'.*\.(aif|aiff)'
:匹配任何以任何长度(.
)开头的任何东西(*
),然后是句号(\.
)和字符串'aif'或'aiff'(或'AIF','AIFF','aiFF'......) ((aif|aiff)
)-exec bash -c
:在非交互式bash shell中执行以下操作就在这附近它变得有点复杂
'$0 "$1" "${1%.*}.wav"'
:这是在bash shell中运行的调用。 $0
将扩展到program name。 "$1"
将扩展到第一个(在这种情况下,仅)参数,在白色空格的情况下用双引号括起来。 "${1%.*}.wav"
也将扩展到第一个参数,除了它将strip away the last period and everything after,然后在最后标记'.wav'。有效地替换文件扩展名。sox {}
:这些是传递给shell调用的参数。第一个(sox
)是我们想要使用的程序,在调用中称为$0
。第二个({}
)是find
找到的任何文件,在shell调用中称为$1
这是相当满口的,我不是专家,所以我写的可能会有一些错误,虽然总体轮廓应该是坚实的。
*这是OSX特定的,不太漂亮但更便携的选项是:
find . -maxdepth 1 \( -iname "*.aif" -o -iname "*.aiff" \) -exec bash -c '$0 "$1" "${1%.*}.wav"' sox {} \;