2017-09-09 15 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ループを持つグロブを使用してください(ffmpegの標準入力からの読み込みを停止する必要もありません)。

さらに微妙に、元の作業ディレクトリを元に戻してから、再帰呼び出しが現在のディレクトリを反復処理している間に作業ディレクトリを "予期せず"変更することはありません。 pushdcdの代わりに)と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

関連する問題