スクリプトを使用して、すべての VIDEO_TS ディレクトリを .ISO に変換します。genisoimage が失敗して次のフォルダーを変換するのではなく、実際に変換しているかどうかを確認するにはどうすればよいですか?
変換後にフォルダーを削除するコマンドがありますが、genisoimage が失敗した場合はフォルダーが削除されます。
#!/bin/bash
iso_name=""
parent_path=""
full_path=""
total=0
IFS=$'\n'
clear
for file in $(find /shares/media/ -type d -name 'VIDEO_TS')
do
parent_path="$(dirname -- "$file")"
full_path="$file"
iso_name="$(basename -- "$parent_path").ISO"
iso_path=""$(dirname -- "$parent_path")"/"$iso_name""
echo "Converting to "$iso_name""
((total++))
genisoimage -allow-limited-size -o "$iso_path" -dvd-video "$parent_path"
rm -rf "$parent_path"
done
echo "Succesfully converted "$total" videos to ISO!"
答え1
すべてのプロセスには終了ステータスこれは 0 から 255 までの数字です。0 は成功を示し、それ以外は失敗を示すという慣例がほぼ普遍的に守られています¹。
シェル スクリプトでは、特殊変数に$?
最後のコマンドの終了ステータスが含まれます。これを複数回使用する必要がある場合は、別の変数に保存します (そうしないと、これを使用する最初のコマンドが$?
そのステータスに設定されます)。
多くの場合、 : を使用する必要はありません$?
。シェルの条件構文を利用して、ゼロと非ゼロに対して異なる反応をすることができます。
if genisoimage …; then
rm rm -rf "$parent_path"
else
echo 1>&2 "genisoimage failed, aborting"
exit 2
fi
スクリプトを終了時のエラー モードに切り替えるには、を使用しますset -e
。単純なコマンドが失敗した場合 (つまり、ゼロ以外のステータスが返された場合)、スクリプトは同じ終了ステータスで直ちに終了します。たとえば、ループset -e
の前にを配置するとfor
、スクリプトはgenisoimage
失敗した場合に直ちに終了します。
ループを継続しながら失敗を記録したい場合は、現在のエラー数を変数に保存します。
successes=0
failures=0
err=0
for file in $(find /shares/media/ -type d -name 'VIDEO_TS')
do
parent_path="$(dirname -- "$file")" # or parent_path=${file%/*}
iso_path="$parent_path.ISO"
echo "Converting to "$iso_name""
genisoimage -allow-limited-size -o "$iso_path" -dvd-video "$parent_path"
ret=$?
if ((ret == 0)); then
rm -rf "$parent_path"
((++successes))
else
((++failures))
if ((ret > err)); then ret=$err; fi
fi
done
echo "Succesfully converted "$total" videos to ISO. There were $failures failures."
exit $err
¹のような検索コマンドの場合grep
、0 は「見つかった」、1 は「見つからなかった」、その他の値は「何らかのエラーが発生しました」を意味します。