Nautilus
使用 zenity 進度條終止腳本
(GNOME2,Ubuntu 10.04 LTS)我已經製作了一個 nautilus 腳本,所以如果我有一個充滿各種編解碼器的目錄,那麼我只需要右鍵點擊該文件夾 -> Scripts -> THISSCRIPT.txt,然後presto,它遞歸地將所有影片文件(由影片 mimetype 標識)轉換為 x.264 編解碼器,將 128 Kbit mp3 轉換為 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
您需要使用該選項
--auto-kill
。我對腳本進行了一些修改(我喜歡您對rev
.我用過
yad
而不是zenity
. 它是zenity的一個分支,命令基本相同。從我讀到的內容來看,yad正在被更積極地開發並且具有更多功能(這對我來說是一個很好的機會來玩它)。該--auto-kill
選項適用於zenity和yad。除了顯示百分比外,腳本還顯示瞭如此多的計數(例如 8 個中的 3 個)以及目前文件的名稱。百分比計算使用
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"