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 -e
das 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 -e
irgendwo vor der for
Schleife einfügen, wird Ihr Skript bei genisoimage
einem 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 grep
bedeutet 0 „gefunden“, 1 „nicht gefunden“ und andere Werte bedeuten „es ist ein Fehler aufgetreten“.