Überprüfen Sie, ob Genisoimage erfolgreich ist

Überprüfen Sie, ob Genisoimage erfolgreich ist

Ich verwende ein Skript, um alle VIDEO_TS-Verzeichnisse in .ISO zu konvertieren. Wie kann ich überprüfen, ob Genisoimage die Konvertierung tatsächlich durchführt, anstatt dass die Konvertierung fehlschlägt und den nächsten Ordner konvertiert?

Nach der Konvertierung habe ich einen Befehl zum Löschen des Ordners, aber wenn Genisoimage fehlschlägt, wird er trotzdem gelöscht.

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

Antwort1

Jeder Prozess hat eineBeendigungsstatus, eine Zahl zwischen 0 und 255. Es gibt eine Konvention, die fast allgemein befolgt wird, dass 0 Erfolg und alles andere einen Misserfolg anzeigt¹.

In einem Shell-Skript enthält die spezielle Variable $?den Beendigungsstatus des letzten Befehls. Wenn Sie sie mehr als einmal verwenden müssen, speichern Sie sie in einer anderen Variable (sonst würde der erste Befehl, der sie verwendet, $?ihren Status festlegen).

Oft müssen Sie nicht verwenden $?: Sie können die bedingten Konstrukte der Shell nutzen, um auf Null und ungleich Null unterschiedlich zu reagieren.

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

Sie können set -edas Skript in den Fehler-beim-Beenden-Modus schalten: Wenn ein einfacher Befehl fehlschlägt (d. h. einen Status ungleich Null zurückgibt), wird das Skript sofort mit demselben Beendigungsstatus beendet. Wenn Sie beispielsweise set -eirgendwo vor der forSchleife einfügen, wird Ihr Skript bei genisoimageeinem Fehler sofort beendet.

Wenn Sie die Schleife weiter ausführen, aber Fehler aufzeichnen möchten, speichern Sie die aktuelle Fehleranzahl in einer Variablen.

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

¹ Bei Suchbefehlen wie grepbedeutet 0 „gefunden“, 1 „nicht gefunden“ und andere Werte bedeuten „es ist ein Fehler aufgetreten“.

verwandte Informationen