
여러 항목(동시에 명령당 하나의 항목)을 다운로드하는 스크립트를 작성 중인데 wget
진행률 표시줄이 필요합니다. 현재 zenity --progress
진행률 표시줄을 활용하고 있지만 문제는 다운로드할 때 여러 개의 진행률 표시줄이 생성된다는 것입니다.
내가 달성하고 싶은 것은 Nautilus의 파일 전송 대화 상자와 비슷합니다.
누구든지 이를 달성할 프로그램이나 언어에 대해 올바른 방향을 알려줄 수 있습니까?
메모: 저는 쉘 스크립팅에 대한 기본적인 지식만 갖고 있고 그 외에는 별로 지식이 없습니다.
답변1
YAD를 이용한 솔루션
개요
Zenity는 꽤 오랫동안 업데이트되지 않았습니다. 다행스럽게도 '포크'라는 포크가 있습니다.야드많은 추가 기능이 있습니다. 아직 공식 저장소에 도착하지 않았지만 webupd8 PPA에서 설치할 수 있습니다.
sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad
YAD에 추가된 기능 중 하나는 다중 진행률 표시줄 대화 상자입니다. 다음은 여러 진행률 표시줄에 관한 YAD 매뉴얼에서 발췌한 내용입니다.
Multi progress bars dialog options
--bar=LABEL[:TYPE]
Add progress bar. LABEL is a text label for progress bar. TYPE is a progress bar type. Types are:
NORM for normal progress bar, RTL for inverted progress bar and PULSE for pulsate progress bar.
--vertical
Set vertical orientation of progress bars.
--align=TYPE
Set alignment of bar labels. Possible types are left, center or right. Default is left.
Initial values for bars set as extra arguments. Each lines with progress data passed to stdin must be started
from N: where N is a number of progress bar. Rest is the same as in progress dialog.
따라서 여러 진행률 표시줄이 있는 매우 간단한 스크립트는 다음과 같습니다.
for i in {1..100}; do
printf "1:$i\n2:$i\n3:$i\n"
sleep 0.2
done | yad --multi-progress --bar="Bar 1":NORM --bar="Bar 2":NORM --bar="Bar 3":NORM
결과는 다음과 같습니다.
다음을 사용하여 막대에 설명을 추가할 수 있습니다 #
.
for i in {1..100}; do
printf "1:$i\n2:$i\n3:$i\n"
printf "1:#Progress 1 is at $i percent\n2:#Progress 2 is at $i percent\n3:#Progress 3 is at $i percent\n"
sleep 0.2
done | yad --multi-progress --bar="Bar 1":NORM --bar="Bar 2":NORM --bar="Bar 3":NORM
결과:
이것을 wget 다운로드 스크립트에서 구현하려면 먼저 몇 가지 작업을 수행해야 합니다.
- wget 출력에서 다운로드 진행 상황 및 기타 흥미로운 데이터를 추출하는 방법을 찾으세요.
- 여러 파일을 반복하는 방법을 찾으세요
- 우리가 가지고 있는 모든 정보를 하나의 야드 대화 상자에 전달하는 방법을 찾으십시오.
나는 이 프로젝트가 꽤 흥미로웠기 때문에 자리에 앉아 위의 모든 작업을 수행하는 스크립트를 작성했습니다.
yad_wget
내가 생각해낸 내용은 다음과 같습니다.
#!/bin/bash
# NAME: yad_wget
# VERSION: 0.2
# AUTHOR: (c) 2014 Glutanimate
# DESCRIPTION: graphical frontend to wget in form of a yad script
# FEATURES: - display progress of multiple simultaneous downloads
# - set maximum number of simultaneous downloads
# DEPENDENCIES: yad
#
# Install yad on Ubuntu with:
#
# sudo add-apt-repository ppa:webupd8team/y-ppa-manager
# sudo apt-get update
# sudo apt-get install yad
#
# LICENSE: GNU GPLv3 (http://www.gnu.de/documents/gpl-3.0.en.html)
#
# NOTICE: THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
# EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
# PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR
# IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
# PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE,
# YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
#
# IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY
# COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS
# PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
# INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
# THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
# INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
# PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
# PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
#
# USAGE: yad_wget <space-delimited URLs>
# Closing the yad dialog will terminate all downloads in progress
# Variables and settings
MAXDLS="5" # set maximum number of simultaneous downloads
URILIST="$@" # gets list of URIs from stdin
USAGE="$0 <space-delimited URLs>"
# Set GUI variables up
TITLE="YAD wget downloader" # dialog title
TEXT="<b>Downloads</b> in progress:" # dialog text
ICON="emblem-downloads" # window icon (appears in launcher)
IMAGE="browser-download" # window image (appears in dialog)
#URILIST="http://proof.ovh.net/files/100Mb.dat http://speedtest.wdc01.softlayer.com/downloads/test10.zip http://cachefly.cachefly.net/100mb.test"
# Usage checks
if [[ -z "$URILIST" ]]
then
echo "Error: No arguments provided"
echo "Usage: $USAGE"
exit 1
fi
# download file and extract progress, speed and ETA from wget
# we use sed regex for this
# source: http://ubuntuforums.org/showthread.php?t=306515&page=2&p=7455412#post7455412
# modified to work with different locales and decimal point conventions
download(){
wget "$1" 2>&1 | sed -u \
"s/.* \([0-9]\+%\)\ \+\([0-9,.]\+.\) \(.*\)/$2:\1\n$2:# Downloading at \2\/s, ETA \3/"
RET_WGET="${PIPESTATUS[0]}" # get return code of wget
if [[ "$RET_WGET" = 0 ]] # check return code for errors
then
echo "$2:100%"
echo "$2:#Download completed."
else
echo "$2:#Download error."
fi
}
# compose list of bars for yad
for URI in $URILIST; do # iterate through all URIs
FILENAME="${URI##*/}" # extract last field of URI as filename
YADBARS="$YADBARS --bar=$FILENAME:NORM" # add filename to the list of URIs
done
IFS=" "
COUNTER="1"
DYNAMIC_COUNTER="1"
# main
# iterate through all URIs, download them in the background and
# pipe all output simultaneously to yad
# source: http://pastebin.com/yBL2wjaY
for URI in $URILIST; do
if [[ "$DYNAMIC_COUNTER" = "$MAXDLS" ]] # only download n files at a time
then
download "$URI" "$COUNTER" # if limit reached wait until wget complete
DYNAMIC_COUNTER="1" # before proceeding (by not sending download() to bg)
else
download "$URI" "$COUNTER" & # pass URI and URI number to download()
DYNAMIC_COUNTER="$[$DYNAMIC_COUNTER+1]"
fi
COUNTER="$[$COUNTER+1]" # increment counter
done | yad --multi-progress --auto-kill $YADBARS --title "$TITLE" \
--text "$TEXT" --window-icon "$ICON" --image "$IMAGE"
# ↑ launch yad multi progress-bar window
그리고 이것은 다음과 같습니다:
스크립트가 어떻게 작동하는지 알아보려면 모든 댓글을 읽어보고 궁금한 점이 있으면 주저하지 말고 아래 댓글로 문의하세요.
편집하다:
최대 동시 다운로드 수 설정 지원을 추가했습니다. 예 MAXDLS="5"
: