Encerre o script usando a barra de progresso do zenity

Encerre o script usando a barra de progresso do zenity

(GNOME2, Ubuntu 10.04 LTS) Eu fiz um script nautilus, então se eu tiver um diretório cheio de vários codecs, então eu só preciso clicar com o botão direito nessa pasta -> Scripts -> THISSCRIPT.txt, então pronto, ele converte recursivamente todos os arquivos de vídeo (identificados pelo tipo mime de vídeo) para codec x.264 com mp3 de 128 Kbit para avi. Para que tenham tamanho pequeno + boa qualidade. Isso funciona, ótimo!

PERGUNTA: Se eu pressionar "Cancelar" na barra de progresso do Zenity, o mencoder não termina.. Como posso fazer isso? Quer dizer, preciso disso. Se eu pressionar "Cancelar" na barra de progresso do Zenity, o mencoder será encerrado. Como fazer isso?

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

Responder1

Você precisa usar a --auto-killopção. Renovei um pouco o script (gosto do seupensando fora do quadradouso de rev, mas existem outras maneiras :) ...Aqui está uma.

Eu usei yadem vez de zenity. É um garfo dezenidade, e os comandos são basicamente os mesmos. Pelo que li,simestá sendo desenvolvido de forma mais ativa e tem mais recursos (e esta foi uma boa chance para eu brincar com ele). A --auto-killopção funciona com amboszenidadeesim.

Além de mostrar a porcentagem, o script mostra umacontagem de tantos(por exemplo, 3 de 8) mais o nome do arquivo atual. O cálculo percentual usa awk(apenas porque estou confortável com sua sintaxe).

Quanto à sua pergunta específica, --auto-killdeve 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"

informação relacionada