Завершить скрипт с помощью индикатора выполнения zenity

Завершить скрипт с помощью индикатора выполнения zenity

(GNOME2, Ubuntu 10.04 LTS) Я сделал скрипт Nautilus, так что если у меня есть каталог, полный различных кодеков, то мне просто нужно щелкнуть правой кнопкой мыши в этой папке -> Scripts -> THISSCRIPT.txt, и вуаля, он рекурсивно преобразует все видеофайлы (идентифицированные по mimetype видео) в кодек x.264 с mp3 128 Кбит в avi. Так что они будут иметь небольшой размер и хорошее качество. Это работает, отлично!

ВОПРОС: Если я нажму «Отмена» на полосе прогресса Zenity, то mencoder не завершит работу. Как мне это сделать? Я имею в виду, что мне это нужно. Если я нажму «Отмена» на полосе прогресса Zenity, то mencoder завершит работу. Как это сделать?

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

решение1

Вам нужно использовать эту --auto-killопцию. Я немного переделал скрипт (мне нравится вашнестандартное мышлениеиспользование rev, но есть и другие способы :) ...Вот один из них.

Я использовал yadвместо zenity. Это ответвлениезенитность, и команды в основном те же самые. Из того, что я читал,йадболее активно разрабатывается и имеет больше функций (и это был хороший шанс для меня поиграть с ним). Опция --auto-killработает с обоимизенитностьийад.

Помимо отображения процента, скрипт показываетколичество так-то много(например, 3 из 8) плюс имя текущего файла. Расчет процентов использует awk(только потому, что мне удобен его синтаксис) ..

Что касается вашего конкретного вопроса, этого --auto-killдолжно быть достаточно.

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"

Связанный контент