zenity 진행 표시줄을 사용하여 스크립트 종료

zenity 진행 표시줄을 사용하여 스크립트 종료

(GNOME2, Ubuntu 10.04 LTS) 노틸러스 스크립트를 만들었으므로 디렉터리에 다양한 코덱이 있으면 해당 폴더를 마우스 오른쪽 버튼으로 클릭하고 -> 스크립트 -> THISSCRIPT.txt를 클릭한 다음 바로 실행하면 됩니다. 모든 비디오 파일(비디오 MIME 유형으로 식별됨)을 128Kbit mp3가 포함된 x.264 코덱으로 avi로 재귀적으로 변환합니다. 그래서 그들은 작은 크기 + 좋은 품질을 갖게 될 것입니다. 작동합니다. 훌륭해요!

질문: Zenity 진행 표시줄에서 "취소"를 누르면 멘코더가 종료되지 않습니다. 어떻게 해야 하나요? 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"

관련 정보