2017-10-09 8 views
1

디렉토리에 .aiff 형식의 파일이 여러 개 있습니다. SoX를 사용하여 .wav 파일로 변환하고 싶습니다. 내가Soff에서 .aiff .wav로 변환

for i in `/Users/me/RainbowAiff/ *.aiff`; do echo -e "$i"; sox $i $i.wav; echo -e "$i.wav"; done; 

을 다음과

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 웹 사이트를, 다음과 this 웹 사이트에 코드를 시도했지만 나는 말한다 두 경우 모두에서 오류 메시지가 "이진 실행할 수 없습니다 파일". 이 오류의 원인은 무엇입니까?

답변

1

호환되지 않는 이진 파일로 인해이 오류가 발생합니다 (see this question).

file soxuname -a 명령의 출력에서 ​​이진 파일과 운영 체제 (예 : x86)가 일치하지 않는다고 알리는 경우 SoX 용 올바른 이진 파일을 찾아야합니다. 2015 년 이후 SoX 출시가 없더라도 시스템과 호환되는 버전을 찾으려면 thisthis을 확인하십시오.

문제는 또한 sox의 파일 특성과 관련이 있습니다. 실행 가능 속성을 부여하려면 sox가있는 폴더로 가서 chmod +x sox 명령을 실행하십시오 (먼저 루트 액세스가 필요합니다).

+1

파일 sox' '의 출력은'마하-O 64 비트 실행 x86_64' 및 출력입니다 'uname -a'는'14.5.0 다윈 커널 버전 14.5.0 : Tue Apr 11 16:12:42 PDT 2017; root : xnu-2782.50.9.2.3 ~ 1/RELEASE_X86_64 x86_64' 호환되지 않습니까? (바이너리 파일에 익숙하지 않다.) 도와 줘서 고마워. – Lisa

+1

나는 Mac 사용자가 아니지만, 불행히도, 나는 그것에 익숙하지 않다. 그들은 둘 다 64 비트 인 것처럼 보입니다. 'su' 명령으로 루트 사용자로 전환하고 sox가있는 디렉토리로 가서'chmod + x sox'를 실행할 수 있습니까? 루트 권한을 가지고'sudo sox'를 사용하여 다시 실행하십시오. 또한 사람들은 Mac에서 비슷한 문제가있는 것 같기 때문에 호환성이있을 수있는 이전 버전의 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 옵션을 기반으로 대체 라이너를 조립할 자유가있었습니다. 아무것도

  • -E에 대해 찾을 수 있습니다 :

    • find을 :

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

      그것을 설명하려면 현재 작업 디렉토리에서 시작 : extended regex *

    • . 수 있습니다. 상대 경로 또는 절대 경로로 바꿀 수 있습니다.

    • -maxdepth 1 : 첫 번째 디렉토리 레이어에서만 찾습니다.사용 사례를 구분 : 또한이 옵션을 제거
      전체 재귀 수 있도록

    • -iregex (파일을 모두 다운 방법을 찾을 수) 것입니다 ... 폴더 내 폴더 내에서 파일을 찾기 위해 3, 폴더 내 파일을 찾을 수 2 1 교체 정규 표현식

    • '.*\.(aif|aiff)'

      : 기간 (\.) 다음 길이 (*)에서 아무것도 (.)로 시작 아무것도하고, 문자열 'AIF'또는 'AIFF'(또는 'AIF', 'AIFF와 일치 ','aiFF '...) ((aif|aiff))

    • -exec bash -c :이 배쉬 내에서 실행되는 전화입니다 : 그것은

      • '$0 "$1" "${1%.*}.wav"' 더 복잡 비트를 얻을 오른쪽 주변

      쉘 비 대화식 떠들썩한 파티에서 다음을 실행 껍질. $0program name으로 확장됩니다. "$1"은 공백 인 경우 큰 따옴표로 묶인 첫 번째 (이 경우에만) 인수로 확장됩니다. "${1%.*}.wav"은 또한 끝 부분에 '.wav'태그를 지정하기 전에 strip away the last period and everything after을 제외하고는 첫 번째 인수로 확장됩니다. 파일 확장명을 효과적으로 대체합니다.

    • sox {} : 이들은 쉘 호출에 전달되는 인수입니다. 첫 번째 (sox)는 우리가 사용하고자하는 프로그램으로, 호출 내에서 $0이라고합니다. 두 번째 ({})를 발견하고 꽤 입의 쉘 호출

    $1로 언급 한 어떤 파일 find 내가 전문가는 아니지만, 그래서 제가했습니다에 대한 약간의 실수가있을 수 있습니다 일반적인 개요는 견고해야합니다.

    *이 특정 OSX, 덜 예쁜하지만 더 휴대용 옵션이 될 것입니다 :

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