Làm cách nào để chỉ hiển thị thanh tiến trình tiện ích?


81

Ví dụ:

wget http://somesite.com/TheFile.jpeg

downloading: TheFile.tar.gz ...
--09:30:42--  http://somesite.com/TheFile.jpeg
           => `/home/me/Downloads/TheFile.jpeg'
Resolving somesite.co... xxx.xxx.xxx.xxx.
Connecting to somesite.co|xxx.xxx.xxx.xxx|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1,614,820 (1.5M) [image/jpeg]

25% [======>                              ] 614,424      173.62K/s    ETA 00:14

Làm thế nào tôi có thể làm cho nó trông như thế này

downloading: TheFile.jpeg ...
25% [======>                              ] 614,424      173.62K/s    ETA 00:14

Tôi biết curl có thể làm được điều đó, tuy nhiên tôi cần phải cố gắng làm công việc đó.


1
Tôi không nghĩ rằng điều này có thể thực hiện được nếu không viết script để phân tích cú pháp đầu ra của wget. wget -nvlà thông tin gần nhất bạn sẽ nhận được và nó không thực sự hiển thị thanh tiến trình, chỉ là bản tóm tắt một dòng khi quá trình tải xuống hoàn tất.
cdhowie

3
wget --progress = bar: force: noscroll
Leo Gallucci

2
curlcó thể tải tập tin và tạo ra một thanh tiến trình đơn giản:echo "downloading: $file ..." && curl --progress-bar --remote-name --location "$url"
curusarn

Câu trả lời:


26

Bạn có thể sử dụng bộ lọc sau:

progressfilt ()
{
    local flag=false c count cr=$'\r' nl=$'\n'
    while IFS='' read -d '' -rn 1 c
    do
        if $flag
        then
            printf '%s' "$c"
        else
            if [[ $c != $cr && $c != $nl ]]
            then
                count=0
            else
                ((count++))
                if ((count > 1))
                then
                    flag=true
                fi
            fi
        fi
    done
}

Sử dụng:

$ wget --progress=bar:force http://somesite.com/TheFile.jpeg 2>&1 | progressfilt
100%[======================================>] 15,790      48.8K/s   in 0.3s

2011-01-13 22:09:59 (48.8 KB/s) - 'TheFile.jpeg' saved [15790/15790]

Chức năng này phụ thuộc vào một chuỗi 0x0d0x0a0x0d0x0a0x0dđược gửi ngay trước khi thanh tiến trình được bắt đầu. Hành vi này có thể phụ thuộc vào việc triển khai.


Nếu bạn không có ít nhất phiên bản 1.16 của wget, điều này rất hữu ích!
A-312

1
Để ngăn lỗi với mã hóa char, bạn phải thay thế %cbằng cách %ssửa lỗi này:
A-312

@HorsSujet: Những cái tôi thấy là từ dấu ngoặc kép đơn trái và phải Unicode. Tôi sẽ chỉnh sửa câu trả lời của mình để thực hiện thay đổi. Cảm ơn bạn đã báo cáo.
Dennis Williamson

Bạn cũng có thể cải thiện mã của mình với chức năng thứ 2, dễ đọc hơn: pastebin.com/Ek5Wf4XK
A-312

Tôi đồng ý rằng điều đó hữu ích trong một kịch bản đầy đủ, nhưng tôi không nghĩ nó cần thiết cho câu trả lời.
Dennis Williamson

183

Sử dụng:

wget http://somesite.com/TheFile.jpeg -q --show-progress
  • -q: Tắt wgetđầu ra của

  • --show-progress: Buộc wgethiển thị thanh tiến trình bất kể mức độ chi tiết của nó được đặt thành


11
Đối với tôi điều này cho thấy wget: unrecognized option '--show-progress'? Bạn có biết nếu điều này chỉ xuất hiện trong các phiên bản wget mới hơn?
Uli Köhler


12
Phải có một số khác biệt giữa các phiên bản, nhưng để làm cho nó hoạt động như được quảng cáo, đối với phiên bản 1.19, tôi cũng cần thêm tùy chọn sau:, --progress=bar:force:noscrollcùng với -q--show-progress. Điều này hoạt động tốt cho Dockerfile trong một bản dựng.
YoYo

1
Như @YoYo đã đề cập, đừng quên --progress=bar:force:noscrollngăn chặn các dòng mới được tạo!
Brent Faust

21

Sử dụng bằng các cờ sau:

wget  -q --show-progress --progress=bar:force 2>&1

Tốt nhất một lớp lót. Tôi không hiểu tại sao nó không phải là câu trả lời được chọn.
Salamandar

Làm gì force 2>&1? Tôi wget -q --show-progress --progress=bardường như chỉ mang lại sản lượng tương tự.
MBT

Đây là người chiến thắng. Đó là một lỗi trong Stack Overflow mà nó không phải là câu trả lời hàng đầu.
mmla

@ MBT: "2> & 1" chỉ đơn giản là kết hợp đầu ra stderr (thường dành cho thông báo lỗi và nhật ký) và stdout (thường có nghĩa là cho kết quả thực tế). Đoán nó là không cần thiết ở đây, nhưng thường nó được sử dụng khi người ta muốn chuyển hướng đầu ra hoàn chỉnh của một quá trình (kết quả và thông báo lỗi) để cùng một mục tiêu
jov14

13

Bạn có thể sử dụng followtùy chọn của tail:

wget somesite.com/TheFile.jpeg --progress=bar:force 2>&1 | tail -f -n +6

Các +6là để xóa 6 dòng đầu tiên. Nó có thể khác với phiên bản của wgetbạn hoặc ngôn ngữ của bạn.

Bạn cần sử dụng --progress=bar:forcenếu không thì wget chuyển sang dotloại.

Nhược điểm là làm mới ít thường xuyên hơn so với wget (trông giống như 2 giây một lần). Các --sleep-intervaltùy chọn taildường như có nghĩa là chỉ cho điều đó, nhưng nó không thay đổi bất cứ điều gì cho tôi.


bạn có biết tại sao nó chuyển sang kiểu chấm không? một số vấn đề loại TERM? lực lượng làm việc cho tôi - cảm ơn!
Neil McGill

Sử dụng điều này để chỉ hiển thị thanh tiến trình mà không có tên tệp đích có giá trị đuôi "8". wget somesite.com/TheFile.jpeg --progress=bar:force 2>&1 | tail -f -n +8
MS Arun

13

Tùy chọn --show-progress, như được chỉ ra bởi những người khác, là tùy chọn tốt nhất, nhưng nó chỉ có sẵn kể từ GNU wget 1.16 , xem Những thay đổi đáng chú ý trong wget 1.16 .

Để an toàn, trước tiên chúng ta có thể kiểm tra xem có --show-progressđược hỗ trợ không:

# set progress option accordingly
wget --help | grep -q '\--show-progress' && \
  _PROGRESS_OPT="-q --show-progress" || _PROGRESS_OPT=""

wget $_PROGRESS_OPT ...

Có lẽ đã đến lúc cân nhắc việc sử dụng curl.


4

Bạn có thể sử dụng các tùy chọn tiêu chuẩn:

wget --progress=bar http://somesite.com/TheFile.jpeg

Tôi không nói về một số bản phân phối khác, nhưng đây chắc chắn không phải là những gì OP yêu cầu, ít nhất là trên Ubuntu. Tức là, nó vẫn hiển thị thông tin khác, nhưng OP yêu cầu "chỉ thanh tiến trình" ...
Dee'Kej

2

Đây là một ví dụ khác, có thể sẽ giúp bạn

download() {
    local url=$1
    echo -n "    "
    wget --progress=dot $url 2>&1 | grep --line-buffered "%" | sed -u -e "s,\.,,g" | awk '{printf("\b\b\b\b%4s", $2)}'
    echo -ne "\b\b\b\b"
    echo " DONE"
}

0

Đây là một giải pháp sẽ hiển thị cho bạn một dấu chấm cho mỗi tệp (hoặc dòng, cho vấn đề đó). Nó đặc biệt hữu ích nếu bạn đang tải xuống với --recursive. Điều này sẽ không bắt lỗi và có thể hơi tắt nếu có thêm dòng, nhưng đối với tiến trình chung trên nhiều tệp, điều này rất hữu ích:

wget -r -nv https://example.com/files/ | \
    awk -v "ORS=" '{ print "."; fflush(); } END { print "\n" }'

-3

Đây không phải là câu trả lời theo nghĩa đen nhưng đoạn mã này cũng có thể hữu ích cho một số người đến đây, ví dụ: "zenity wget GUI":

LANG=C wget -O /dev/null --progress=bar:force:noscroll --limit-rate 5k http://nightly.altlinux.org/sisyphus/ChangeLog 2>&1 | stdbuf -i0 -o0 -e0 tr '>' '\n' | stdbuf -i0 -o0 -e0 sed -rn 's/^.*\<([0-9]+)%\[.*$/\1/p' | zenity --progress --auto-close

Điều quan trọng đối với tôi là stdbuf(1).


2
Bạn có thể giải thích dòng dài này làm gì không? Nếu bạn đã nói rằng đây "không phải là câu trả lời theo nghĩa đen", thì dòng đó liên quan đến câu hỏi như thế nào?
Nico Haase

Điều này có liên quan thông qua một hướng tìm kiếm tiềm năng, đó là những gì tôi đã nêu; dòng lệnh chạy wget trong ngôn ngữ "C" với các đối số để làm cho nó xuất tiến trình theo cách phù hợp để xử lý thêm (với bộ đệm I / O bị tắt) vào thanh tiến trình của zenity - dẫn đến một loại GUI đẹp cho một số trình trợ giúp tải xuống chẳng hạn.
Michael Shigorin

Vui lòng thêm tất cả lời giải thích cho câu trả lời riêng của mình, không để phần bình luận
Nico Haase

Những người không thể nhận được tất cả lời giải thích từ dòng lệnh được đưa ra không thực sự cần nó - họ sẽ sao chép-dán mà không cần suy nghĩ nhiều hoặc chỉ bỏ qua tất cả; và những người có thể, không cần tôi làm thông dịch viên. Nó giống như thông điệp cam kết khác và cam kết: không cần phải nhắc lại cái trước trong cái sau, thay vào đó là nguyên nhân và mục đích. Làm ơn đừng yêu cầu mọi người làm những điều ngớ ngẩn :-)
Michael Shigorin 13/09 '19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.