我在目录中有多个文件是.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;
但是我在两个实例中都收到一条错误消息,说明"无法执行二进制文件"。可能是这个错误的根源是什么?
答案 0 :(得分:1)
不兼容的二进制文件导致此错误see this question。
如果file sox
和uname -a
命令的输出表明二进制文件与操作系统之间存在差异,即x86与ARM,则需要为SoX找到正确的二进制文件。虽然自2015年以来没有SoX版本,但请检查this和this以查找与您的系统兼容的版本。
问题还与sox的文件属性有关。为了给它提供可执行属性,只需转到sox所在的文件夹并运行chmod +x sox
命令(首先需要root访问权限)。
答案 1 :(得分:1)
使用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 {} \;