2017-09-09 5 views
0

폴더의 모든 m4a 파일을 반복하고 mp3로 인코딩하는 간단한 스크립트를 작성하고 있습니다. 실행 속도를 높이고 PC의 모든 코어를 활용하기 위해 다른 스레드에서 파일의 인코딩을 수행하고 싶습니다. 그래야 배경에 작업을 보내고 있습니다. 이것이 올바른 접근이라면 조언을주십시오. 어쨌든, 나는 이 없습니다. 해당 파일이나 디렉토리가 없습니다. 인코딩하려는 모든 단일 파일에 대해 파일이 있어도 오류가 발생합니다. 재미있는 점은 터미널에 똑같은 명령어를 복사하면 제대로 실행된다는 것입니다. 내가 뭘 잘못하고 있는지 알아 내게 도와 줄 수 있니?Bash 스크립트가 파일을 찾지 못함

미리 감사드립니다.

#!/bin/bash 

function encode { 
    echo "<<<<<<<<<<<encode>>>>>>>>>>>>>>>>" 
    cd "$1" 
    find . -mindepth 1 -maxdepth 1 | while read f 
    do 
     if [ -f "${f}" ] 
     then 
      if [ ${f: -4} == ".m4a" ] 
      then 
       if [ ! -d "converted" ] 
       then 
        mkdir converted 
       fi 
       newPath="${f%m4a}mp3" 
       echo "ffmpeg -i \""$f"\" -ac 2 -b:a 320k -y \""$newPath"\" </dev/null >/dev/null &" 
       ffmpeg -i \""$f"\" -ac 2 -b:a 320k -y \""$newPath"\" </dev/null >/dev/null & 
      fi 
     elif [ -d "${f}" ] 
     then 
      echo "folder $f" 
      encode "$f" 
     fi 
    done 
} 


encode "$1" 
+0

인용문이 너무 많습니다. – chepner

답변

0

당신이 암시하는 문제는 파일 이름에 리터럴 따옴표를 추가한다는 것입니다. "$f"$f의 값을 그대로 ffmpeg 명령에 전달하는 것으로 충분합니다. 디렉토리의 내용을 반복 처리하기 위해 find을 사용할 필요는 없습니다. for 루프가있는 glob을 사용하십시오 (ffmpeg이 표준 입력에서 읽는 것을 막을 필요가 없습니다).

좀 더 자세히 살펴보면 원래 작업 디렉터리를 복원하기 전에 원래 작업 디렉터리를 복원해야하므로 재귀 호출은 현재 디렉터리를 반복하는 동안 "예기치 않게"작업 디렉터리를 변경하지 않습니다. pushd (cd 대신) 및 popd이 간단합니다.

encode() { 
    echo "<<<<<<<<<<<encode>>>>>>>>>>>>>>>>" 
    pushd "$1" 
    for f in *; do 
    if [ -d "$f" ]; then 
     encode "$f" 
    elif [[ $f = *.m4a ]]; then 
     mkdir -p converted 
     newPath="${f%.m4a}.mp3" 
     ffmpeg -i "$f" -ac 2 -b:a 320k -y "$newPath" > /dev/null & 
    fi 
    done 
    popd 
} 
+0

감사합니다. 매력처럼 작동했습니다. 인코딩 된 경로에 "변환 된"디렉토리를 추가하여 새로 생성 된 폴더에 저장합니다. – user2751809

관련 문제