Beenden Sie das Skript mithilfe des Zenity-Fortschrittsbalkens

Beenden Sie das Skript mithilfe des Zenity-Fortschrittsbalkens

(GNOME2, Ubuntu 10.04 LTS) Ich habe ein Nautilus-Skript erstellt, sodass ich, wenn ich ein Verzeichnis voller verschiedener Codecs habe, nur mit der rechten Maustaste in diesen Ordner klicken muss -> Skripte -> THISSCRIPT.txt, und dann, presto, konvertiert es rekursiv alle Videodateien (identifiziert durch Video-MIME-Typ) in den x.264-Codec mit 128 Kbit MP3 nach AVI. Damit sind sie klein und von guter Qualität. Das funktioniert super!

FRAGE: Wenn ich auf dem Zenity-Fortschrittsbalken auf „Abbrechen“ drücke, wird Mencoder nicht beendet. Wie kann ich das machen? Ich meine, ich brauche das. Wenn ich auf dem Zenity-Fortschrittsbalken auf „Abbrechen“ drücke, wird Mencoder beendet. Wie mache ich das?

#!/bin/bash

which mencoder > /dev/null 2>&1; if [[ $? -ne 0 ]]; then echo -e '\nerror, no mencoder package detected'; exit 1; fi
which zenity > /dev/null 2>&1; if [[ $? -ne 0 ]]; then echo -e '\nerror, no zenity package detected'; exit 1; fi

HOWMANYLEFT=0
find . -type f | xargs -I {} file --mime-type {} | fgrep "video/" | rev | awk 'BEGIN {FS="/oediv :"} { print $NF}' | rev | while read ONELINE
    do
    if file "$ONELINE" | egrep -qvi "x.264|h.264"
        then echo $ONELINE
    fi
done | sed 's/^.\///' | tee /tmp/vid-conv-tmp.txt | while read ONELINE
    do
    HOWMANY=`wc -l /tmp/vid-conv-tmp.txt | cut -d " " -f1`
    mencoder "$ONELINE" -o "OK-$ONELINE.avi" -ovc x264 -x264encopts bitrate=750 nr=2000 -oac mp3lame -lameopts cbr:br=128 > /dev/null 2>&1
    HOWMANYLEFT=`expr $HOWMANYLEFT + 1`
    echo "scale=10;($HOWMANYLEFT / $HOWMANY) * 100" | bc | cut -d "." -f1
done | zenity --progress --text="Processing files ..." --auto-close --percentage=0

Antwort1

Sie müssen die --auto-killOption verwenden. Ich habe das Skript ein wenig überarbeitet (ich mag Ihrüber den Tellerrand hinaus denkenVerwendung von rev, aber es gibt auch andere Möglichkeiten :) ... Hier ist eine.

Ich habe yadanstelle von verwendet zenity. Es ist eine Abzweigung vonZenitund die Befehle sind im Grunde die gleichen. Soweit ich gelesen habe,jawird aktiver entwickelt und hat mehr Funktionen (und das war eine gute Gelegenheit für mich, damit zu spielen). Die --auto-killOption funktioniert mit beidenZenitUndja.

Neben der Prozentangabe zeigt das Skript auch eineAnzahl von so vielen(z. B. 3 von 8) plus den Namen der aktuellen Datei. Die Prozentberechnung verwendet awk(nur weil ich mit der Syntax vertraut bin) ..

Zu Ihrer konkreten Frage: „einfach“ --auto-killsollte reichen.

for p in mencoder yad ;do
    which $p >/dev/null 2>&1 || { echo -e '\nerror, no $p package detected'; exit 1; }
done

list="$(mktemp)"
find . -type f -print0 |   # -print0 caters for any filename 
  xargs --null file --print0 --mime-type | 
    sed -n 's|\x00 *video/.*|\x00|p' | tr -d $'\n' |
      xargs --null file --print0 |
        sed -nr '/\x00.*(x.264|h.264)/!{s/^\.\///; s/\x00.*//; p}' >"$list"
        # At this point, to count how many files there are to process, break out of the pipe.
        # You can't know how many there are until they have all passed through the pipe.

fct=0; wcfct=($(wc "$list"));
while IFS= read -r file ;do
    ((fct+=1)); pcnt=$(awk -v"OFMT=%.2f" "BEGIN{ print (($fct-1)/$wcfct)*100 }")
    echo "# $pcnt%: $fct of $wcfct: $file"; echo $pcnt
    mencoder "$file" -o "OK-$file.avi" -ovc x264 -x264encopts bitrate=750 nr=2000 -oac mp3lame -lameopts cbr:br=128 >/dev/null 2>&1
done <"$list" | yad --title="Encoding Progress" --progress --geometry +100+100 --auto-close --auto-kill 
rm "$list"

verwandte Informationen