2017-10-09 60 views
1

我在.aiff格式的目錄中有多個文件,並且我想使用SoX將它們轉換爲.wav。我曾嘗試代碼上this網站,這是如下將.aiff轉換爲SoX中的.wav

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; 

,但我得到了這兩種情況下,指出錯誤消息「無法執行二進制文件」。什麼可能是這個錯誤的來源?

回答

1

不兼容的二進制文件導致此錯誤,see this question

如果file soxuname -a命令的輸出指示二進制文件與操作系統(即x86與ARM)之間存在差異,則需要爲SoX找到正確的二進制文件。雖然自2015年以來沒有發佈SoX,但請檢查thisthis以查找與您的系統兼容的版本。

該問題也與sox的文件屬性有關。爲了賦予它可執行屬性,只需轉到sox所在的文件夾,然後運行chmod +x sox命令(首先需要root訪問權限)。

+1

的'文件sox'輸出是'Mach-O的64位可執行x86_64'和輸出'uname -a'是'14.5.0 Darwin Kernel版本14.5.0:2017年4月11日星期二16:12:42 PDT; root:xnu-2782.50.9.2.3〜1/RELEASE_X86_64 x86_64'這些不兼容嗎? (我不熟悉二進制文件)。感謝您的幫助。 – Lisa

+1

我不是Mac用戶,不幸的是,我不熟悉它。不過,它們似乎都是64位的。你可以嘗試用'su'命令切換到root用戶並轉到sox所在的目錄,然後運行'chmod + x sox'?然後嘗試再次運行它,最好使用'sudo sox',並具有root權限。此外,人們似乎也有類似的問題,所以你可能想嘗試安裝舊版本的sox,這可能是兼容的:https://stackoverflow.com/questions/13499871/sox-sound-exchange-on- mac-ppc-10-4-installation-questions –

+1

這工作,但現在我收到語法錯誤。我想這應該是一個單獨的問題。謝謝! – Lisa

1

您鏈接到的兩個片段看起來有點粗略,我使用lsecho
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的內部運行通話貝殼。 $0將展開至program name"$1"將展開爲第一個(在這種情況下,僅限於)參數,如果使用空格,則使用雙引號括起來。 "${1%.*}.wav"也將擴展到第一個參數,除了它將在strip away the last period and everything after之前,在最後標記'.wav'之前。有效替換文件擴展名。

  • sox {}:這些是傳遞給shell調用的參數。第一個(sox)是我們要使用的程序,在呼叫中稱爲$0。第二({})是什麼文件find發現,殼呼叫

這是相當拗口內被稱爲$1和我不是專家,所以有可能是在我所一些錯誤書面的,但大綱應該是堅實的。

*這是OSX具體,不那麼漂亮,但更便攜的選擇是:

find . -maxdepth 1 \(-iname "*.aif" -o -iname "*.aiff" \) -exec bash -c '$0 "$1" "${1%.*}.wav"' sox {} \;