compruebe si genisoimage es exitoso

compruebe si genisoimage es exitoso

Utilizo un script para convertir todos los directorios VIDEO_TS a .ISO. ¿Cómo puedo comprobar si genisoimage realmente lo está convirtiendo en lugar de fallar y convertir la siguiente carpeta?

Después de la conversión, tengo un comando para eliminar la carpeta, pero si genisoimage falla, aún así la elimina.

#!/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!"

Respuesta1

Todo proceso tiene unestado de salida, que es un número entre 0 y 255. Existe una convención que se sigue prácticamente universalmente: 0 indica éxito y cualquier otra cosa indica fracaso¹.

En un script de shell, la variable especial $?contiene el estado de salida del último comando. Si necesita usarlo más de una vez, guárdelo en otra variable (de lo contrario, el primer comando que lo use se establecerá $?en su estado).

A menudo, no es necesario utilizar $?: puede utilizar las construcciones condicionales del shell para reaccionar de manera diferente a cero y distinto de cero.

if genisoimage …; then
  rm rm -rf "$parent_path"
else
  echo 1>&2 "genisoimage failed, aborting"
  exit 2
fi

Puede utilizar set -epara cambiar el script al modo de error al salir: si un comando simple falla (es decir, devuelve un estado distinto de cero), el script sale inmediatamente, con el mismo estado de salida. Por ejemplo, si coloca set -ealgún lugar antes del forbucle, su secuencia de comandos saldrá inmediatamente si genisoimagefalla.

Si desea seguir realizando bucles pero registrar fallas, guarde el recuento de errores actual en una variable.

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

¹ Para comandos de búsqueda como grep, 0 significa "encontrado", 1 significa "no encontrado" y otros valores significan "ocurrió algún error".

información relacionada