여러 개의 진행률 표시 줄이있는 wget GUI를 작성하는 방법


21

사용하여 여러 항목 (동시에 명령 당 하나의 항목)을 다운로드하는 스크립트를 작성 wget중이며 진행률 표시 줄이 필요합니다. 현재 zenity --progress진행률 표시 줄을 사용하고 있지만 문제는 다운로드 할 때 여러 진행률 표시 줄을 생성한다는 것입니다.

내가 달성하고자하는 것은 노틸러스의 파일 전송 대화 상자와 비슷한 것입니다.

우분투의 파일 전송 대화 상자

누구든지 이것을 달성 할 프로그램이나 언어에 대해 올바른 방향을 제시 할 수 있습니까?

참고 : 나는 쉘 스크립팅에 대한 기본 지식 만 가지고 있습니다.


시도 했습니까 axel-kapt? sudo apt-get install axel-kapt

현상금은 거의 끝났습니다. 내 답변에 만족하는 경우 할당을 잊지 마십시오.
Glutanimate

문제 없습니다 당신의 스크립트와 함께 행운을 빈다!
Glutanimate

답변:


28

YAD를 사용한 솔루션


개요

Zenity는 꽤 오랫동안 업데이트되지 않았습니다. 운 좋게도 많은 기능이 추가 된 YAD 라는 포크가 있습니다. 공식 저장소에는 아직 도착하지 않았지만 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 대화 상자에 우리가 가진 모든 정보를 전달하는 방법을 찾으십시오.

이 프로젝트가 다소 흥미로워 서 위의 모든 작업을 수행하는 스크립트를 작성했습니다.


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":

여기에 이미지 설명을 입력하십시오


이것은 매우 포괄적이고 흥미로운 게시물이며 지금까지 내가보고있는 것을 좋아합니다. 이 작은 프로젝트로 시간을내어 주셔서 감사합니다. :) Q1 : 완성 된 파일의 진행률 표시 줄은 어떻게됩니까? 다른 모든 작업이 완료 될 때까지 대화 상자에 남아 있습니까? Q2 : 내가보고있는 것부터 대화 상자에서 개별 작업을 취소 할 수있는 방법이 없습니까?
레이 레너드 아 모라토

1
yad; +1 훌륭한 패키지입니다. 주의하십시오 --notification에이 yad우분투 13.04에 나중에 때문에 작동하지 않습니다 버그 1305835버그 1119420 (버그에 대한 링크와 투표를 따르십시오).
Paddy Landau

2
추가 제어 기능 을 사용하려면 거의 모든 작업을 수행 할 수있는 GtkDialog이동 해야합니다 . 그러나 훨씬 더 복잡합니다. 퍼피 리눅스의 사회는 광범위하게 사용합니다.
DocSalvager

1
@Glutanimate-혼동을 피하기위한 간단한 참고 사항 : PuppyLinux 포럼의 많은 참고 문헌은 "gtkdialog3"및 "gtkdialog4"를 참조합니다. 이것들은 실제 GtkDialog 버전에 대한 더 간단한 동의어이며 심지어 일관성이 없습니다. 파악한 버전 0.8.3이 최신 버전이며 매우 안정적입니다. (중재자 : 더 이상 GtkDialog에 관심이 없습니다. 관심있는 사람은 새로운 질문을 게시하십시오.)
DocSalvager

1
@Glutanimate 나는 yad몇 달 동안 사용해 왔으며 그 힘에 크게 감명 받았습니다. 당신의 대답은 내 진보 바보다 절대적으로 훌륭하고 가벼운 몇 년입니다. wget진도 바코드를 내 앱 ( askubuntu.com/questions/900319/…)에 매우 빠르게 적용 할 수 있습니다 .
WinEunuuchs2Unix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.