检查genisoimage是否成功

检查genisoimage是否成功

我使用脚本将所有 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 表示成功,其他任何值表示失败。

在 shell 脚本中,特殊变量$?包含最后一个命令的退出状态。如果您需要多次使用它,请将其保存到另一个变量(否则使用它的第一个命令将设置$?为其状态)。

通常,您不需要使用$?:您可以利用 shell 的条件构造对零和非零做出不同的反应。

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

1对于诸如 之类的搜索命令grep,0 表示“找到”,1 表示“未找到”,其他值表示“发生了一些错误”。

相关内容