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