web-dev-qa-db-ja.com

bashスクリプトでffmpeg / avconvからのエラー出力をキャプチャする方法

たくさんのファイルをバッチ変換しようとしていますが、変換されたファイルの簡単なリストをテキストドキュメントに変換して、スクリプトを停止し、開始した頃から続行できるようにしています。

#! /bin/sh
source_dir="/home/eldamar/video"

find $source_dir -type f -regex ".*/.*\.\(mov\|mpg\|mkv\|avi\|m2v\|wmv\|flv\|m2ts\|vob\)" | {
while read file
  do
  ext=${file##*.}
  filename=${file##*/}
  basename=${filename%.*}
  dirname=${file%/*}
  touch converted.txt

  if grep -Fxq "$filename" converted.txt
  then
    echo "$(tput setaf 2)File "$filename" is allready converted, ignoring it :D$(tput setaf 7)"
  else
    # Extract subtitles for mkv files
    echo $ext
    if [ "$ext"=="mkv" ]; then
      # input.srt <- default subtitle
      # input.lang.srt <- other languages
      $sublang=""
      mkvinfo=$(mkvinfo $file | grep subtitles -B3 -A3)

      # Replace existing .srt
      # rm $dirname/$basename.srt

      # Extract subtitle from mkv
      # mkvextract tracks input.mkv -c ISO8859-1 3:$dirname/$basename.$sublang.srt
    fi

    avconv -y -i $file -map 0 -map -0:s -vcodec libx264 -acodec libfaac $dirname/$basename.mp4

    # Store the filename in list
    echo $filename >> converted.txt
  fi
  done;
}

字幕の抽出も進行中ですが、avconvが失敗するかどうかわからないのですが、方法はありますか?

編集このスクリプトでやや完了しました。ここにあります http://Pastebin.com/trMDRaq5 助けてくれてありがとう!

3
eldamar

エラーが発生した場合、ほとんどのコマンドはゼロ以外の戻り値を返します。その戻りコードをキャプチャするか、||および&&を介して処理することができます。

例:

avconv -y -i file1 ; echo command finished

avconv -y -i file1 && echo command finished successfully.

avconv -y -i file1 || echo command finished but indicated failure!

[編集]

シェルで$?を確認することもできます。例:

#!/ bin/sh 
/usr/bin/true 
 echo $?
/usr/bin/false 
 echo $?

Trueは常に成功します。テストスクリプトを実行すると、0が返されます。
Falseは常に失敗します。テストスクリプトを実行すると、0以外が返されます。 (私の場合は1ですが、異なる場合があります)。

3
Hennes