Terminar el script usando la barra de progreso de zenity

Terminar el script usando la barra de progreso de zenity

(GNOME2, Ubuntu 10.04 LTS) He creado un script nautilus, de modo que si tengo un directorio lleno de varios códecs, solo necesito hacer clic derecho en esa carpeta -> Scripts -> THISSCRIPT.txt, y listo, Convierte recursivamente todos los archivos de vídeo (identificados por el tipo MIME de vídeo) al códec x.264 con mp3 de 128 Kbit a avi. Para que tengan tamaño pequeño+buena calidad. ¡Esto funciona, genial!

PREGUNTA: Si presiono "Cancelar" en la barra de progreso de Zenity, el mencoder no finaliza. ¿Cómo puedo hacer esto? Quiero decir, necesito que si presiono "Cancelar" en la barra de progreso de Zenity, finalizará mencoder. ¿Como hacer esto?

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

Respuesta1

Necesitas usar la --auto-killopción... He renovado un poco el script (me gusta tupensar fuera del cuadradouso de rev, pero hay otras formas :) ... Aquí hay una.

He usado yaden lugar de zenity. es un tenedor dezenidad, y los comandos son básicamente los mismos. Por lo que he leído,jajajase está desarrollando más activamente y tiene más funciones (y esta fue una buena oportunidad para mí de jugar con él). La --auto-killopción funciona con ambos.zenidadyjajaja.

Además de mostrar el porcentaje, el guión muestra unacuenta de tantos(por ejemplo, 3 de 8) más el nombre del archivo actual. El cálculo de porcentaje utiliza awk(solo porque me siento cómodo con su sintaxis) ..

Con respecto a su pregunta específica, --auto-killdebería ser suficiente.

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"

información relacionada