wgetプログレスバーのみを表示するにはどうすればよいですか?


81

例えば:

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

どうすればこのように見せることができますか

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

私はcurlがそれを行うことができることを知っています、しかし私はその仕事をするためにwgetを取得する必要があります。


1
wgetの出力を解析するスクリプトを書かなければ、これは不可能だと思います。 wget -nvは、取得しようとしている最も近いものであり、実際にはプログレスバーは表示されず、ダウンロードが完了すると1行の要約のみが表示されます。
cdhowie 2011年

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

2
curlファイルをダウンロードして、簡単なプログレスバーを作成できます。echo "downloading: $file ..." && curl --progress-bar --remote-name --location "$url"
curusarn19年

回答:


26

次のフィルターを使用できます。

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
}

使用法:

$ 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]

この機能は0x0d0x0a0x0d0x0a0x0d、プログレスバーが開始される直前に送信されるシーケンスに依存します。この動作は実装に依存する場合があります。


少なくともバージョン1.16のwgetがない場合、これは便利です!
A-

1
文字エンコーディングでバグを回避するには、交換する必要が%c%s:この修正する
A-312

@HorsSujet:私が見ているのはUnicodeの左右の一重引用符です。回答を編集して変更します。レポートをありがとう。
デニスウィリアムソン

2番目の関数を使用してコードを改善することもできます。より読みやすくなります:pastebin.com/Ek5Wf4XK
A-3

それが完全なスクリプトで役立つことに同意しますが、答えには必要ないと思います。
デニスウィリアムソン

184

使用する:

wget http://somesite.com/TheFile.jpeg -q --show-progress
  • -qwgetの出力をオフにする

  • --show-progresswget詳細レベルがどのように設定されていても、プログレスバーを強制的に表示します


11
私にとってこれは示していwget: unrecognized option '--show-progress'ますか?これが新しいwgetバージョンにのみ存在するかどうか知っていますか?
ウリケーラー


12
バージョン間で多少の違いがあるはずですが、宣伝どおりに機能させるには、バージョン1.19の場合、次のオプションも追加する必要があります:--progress=bar:force:noscroll-qおよび--show-progress。これは、ビルド内のDockerfileでうまく機能します。
ヨーヨー2018

1
@YoYoが言及し--progress=bar:force:noscrollているように、改行の生成を停止することを忘れないでください!
ブレントファウスト

21

次のフラグを使用して使用します。

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

最高のワンライナー。なぜそれが選ばれた答えではないのか分かりません。
サラマンダー

何をしforce 2>&1ますか?ただ、wget -q --show-progress --progress=bar私のために同じ出力を得ているようです。
MBT

これが勝者です。それがトップアンサーではないのはStackOverflowのバグです。
mmla

@ MBT: "2>&1"は、stderr(通常はエラーメッセージとログメッセージ用)とstdout(通常は実際の結果用)の出力を単純に組み合わせたものです。ここでは不要だと思いますが、プロセスの完全な出力(結果とエラーメッセージ)を同じターゲットにリダイレクトする場合によく使用されます
jov14

13

次のfollowオプションを使用できますtail

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

+6最初の6行を削除することです。お使いのバージョンwgetや言語によって異なる場合があります。

--progress=bar:forceそれ以外の場合は、dotタイプへのwgetスイッチを使用する必要があります。

欠点は、更新の頻度がwgetよりも少ないことです(2秒ごとのように見えます)。の--sleep-intervalオプションはtailそのためだけのもののようですが、私にとっては何も変わりませんでした。


ドットタイプに切り替わる理由をご存知ですか?いくつかのTERMタイプの問題?力は私のために働いた-ありがとう!
Neil McGill 2016年

これを使用して、テール値が「8」のターゲットファイル名なしでプログレスバーのみを表示します。wget somesite.com/TheFile.jpeg --progress=bar:force 2>&1 | tail -f -n +8
MSArun20年

13

オプションは--show-progress、他人による尖ったアウトとして、最良の選択肢であるが、GNU wgetのが唯一以降で使用可能です1.16を参照して、wgetの1.16で注目すべき変化を

安全のために、最初に--show-progressサポートされているかどうかを確認できます。

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

wget $_PROGRESS_OPT ...

たぶん、を使用することを検討する時が来ましたcurl


4

標準オプションを使用できます。

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

私は他のいくつかのディストリビューションについては知りませんが、少なくともUbuntuでは、これはOPが要求したものではありません。すなわち、それはまだ、他の情報を示しているが、OPは「唯一のプログレスバー」...を求めて
Dee'Kej

2

これは別の例です、多分あなたを助けるでしょう

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

これは、各ファイル(または行)のドットを表示するソリューションです。でダウンロードする場合に特に便利です--recursive。これはエラーをキャッチせず、余分な行がある場合はわずかにずれている可能性がありますが、多くのファイルの一般的な進行状況には役立ちます。

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

-3

これは文字通りの答えではありませんが、このスニペットは、たとえば「zenitywgetGUI」のためにここに来る人にも役立つ可能性があります。

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

私にとって重要だったのはstdbuf(1)です。


2
この長い列が何をするのか説明できますか?これが「文字通りの答えではない」とすでに述べている場合、その行は質問とどのように関連していますか?
ニコハーゼ

これは、潜在的な検索方向に関連しています。それが私が述べたことです。コマンドラインは、引数を指定して「C」ロケールでwgetを実行し、(I / Oバッファリングをオフにして)さらに処理するのに適した方法で進行状況をzenityの進行状況バーに出力します。たとえば、ヘルパーをダウンロードします。
マイケルシゴリン

コメントセクションではなく、回答自体にすべての説明を追加してください
Nico Haase

与えられたコマンドラインからすべての説明を取得できない人は、実際にはそれを必要としません。あまり考えずにコピーアンドペーストするか、すべてをスキップします。できる人は、通訳として私を必要としません。これは、commitdiffとcommitmessageのようなものです。後者の中で前者を繰り返す必要はなく、原因と意図を繰り返す必要があります。愚かなことをするように人々に頼まないでください:
MichaelShigorin19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.