wget 一括ダウンロードと失敗したリンクの保存

wget 一括ダウンロードと失敗したリンクの保存

wgetを使用して1つのテキストファイルから複数のファイルをダウンロードし、失敗したダウンロードのURLを別のテキストファイルに保存できますか?

私はwget bashスクリプトを使用して、次のテキストファイルからファイルをダウンロードしています。

wget -i "/home/user/downloadURLs.txt"

downloadURLs.txtには、ダウンロードするURLの各行が含まれています。

http://[website].com/file1
http://[website].com/file2
http://[website].com/file3
http://[website].com/file4

ファイルの1つがダウンロードに失敗した場合は、失敗したURLを別のファイルに保存したいと思います。しかし、wgetの-iオプションを使用してダウンロードするときにすべてのダウンロードが成功すると終了コードは0になり、ダウンロードが完全に失敗すると終了コードはエラー終了コードになると思います。各個々のURLの終了コードを取得できない場合は、失敗したURLのみを保存することはできません。

私はこれがうまくいくと思います:

#!/bin/bash

#map lines of text file to an array
mapfile -t inputUrls < "/home/user/downloadURLs.txt"

for url in ${inputUrls[@]}
do
    wget "$url"

    if [[ $? != 0 ]]
    "$url" >> "/home/user/failedDownloads.txt"
    fi
done

私がこれをしたいかどうかわからない理由は、ウェブサイトから複数のファイルをダウンロードするときにwgetがしばしば「[サイト]への既存の接続を再利用する」と言うからです。この動作は1つのウェブサイトでダウンロードを高速化するためであると思われ、各URLに対して個別にwgetを呼び出すと最適化が失われるようです。

-i入力ファイルを使用すると、wgetをより効率的にダウンロードできると思いますか?

私が正しい場合は、wgetの最適化を引き続き使用しながら、どのようにテキストファイルからURLをダウンロードし、失敗したURLを別のファイルに保存できますか?誰でもここに提供できる洞察力に感謝します。

ベストアンサー1

単にリダイレクトしないのはなぜですかstderr

$ wget -i test.txt 2> wget-fail.log

$ cat  wget-fail.log 
--2016-11-15 22:06:50--  http://failing-host.com/
Auflösen des Hostnamen »failing-host.com (failing-host.com)«... fehlgeschlagen: Der Name oder der Dienst ist nicht bekannt.
wget: kann die Host-Adresse »failing-host.com« nicht auflösen

[編集する]

stdoutとstderrを格納するログを生成するために、bashスクリプトにロギング機能を設定しました。 2>を使用すると、正常なダウンロードを含む同様の量の情報を含むログファイルを生成するようです。ログファイルを解析する観点から、この問題を解決できます。

解析は必要ありません。

$ cat wget.sh 
#!/bin/bash
echo log to stdout
echo >&2 log to stderr
wget -i test.txt 2> wget-fail.log

$ sh wget.sh  &> script.log

$ cat script.log 
log to stdout
log to stderr

$ cat wget-fail.log 
--2016-11-15 23:02:00--  http://failing-host.com/
Auflösen des Hostnamen »failing-host.com (failing-host.com)«... fehlgeschlagen: Der Name oder der Dienst ist nicht bekannt.
wget: kann die Host-Adresse »failing-host.com« nicht auflösen

おすすめ記事