スクリプトで多くの URL をダウンロードしたいのですが、HTTP エラーにつながる URL を保存したくありません。
マニュアルページからわかる限り、そのような機能は提供されていcurl
ません。wget
他のダウンローダーについて知っている人はいますか?
-f
オプションはあなたが望むことをすると思いcurl
ます:
-f
、--fail
(HTTP) サーバー エラーでサイレントに失敗します (出力はまったくありません)。これは主に、スクリプトなどをより適切に有効にして、失敗した試行をより適切に処理するために行われます。通常、HTTP サーバーがドキュメントの配信に失敗すると、その旨を示す HTML ドキュメントを返します (多くの場合、理由なども説明されています)。このフラグは、curl がそれを出力するのを防ぎ、エラー 22 を返します。 [...]
ただし、応答が実際に 301 または 302 リダイレクトであった場合は、宛先がエラーになる場合でも保存されます。
$ curl -fO http://google.com/aoeu
$ cat aoeu
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/aoeu">here</A>.
</BODY></HTML>
リダイレクトを行き止まりまでたどるには、次の-L
オプションも指定します。
-L
、--location
(HTTP/HTTPS) 要求されたページが別の場所に移動したことをサーバーが報告した場合 (Location: ヘッダーと 3XX 応答コードで示されます)、このオプションにより、curl は新しい場所で要求をやり直します。[...]
この目的のためにセットアップした1つのライナー:
(単一のファイルでのみ機能し、他の人にも役立つ場合があります)
A=$$; ( wget -q "http://foo.com/pipo.txt" -O $A.d && mv $A.d pipo.txt ) || (rm $A.d; echo "Removing temp file")
これにより、リモートホストからファイルをダウンロードしようとします。エラーが発生した場合、ファイルは保持されません。他のすべての場合、それは保持され、名前が変更されます。
古代のスレッド..解決策を探してここに着陸しました...それを行うためのシェルコードを書くことになりました。
if [ `curl -s -w "%{http_code}" --compress -o /tmp/something \
http://example.com/my/url/` = "200" ]; then
echo "yay"; cp /tmp/something /path/to/destination/filename
fi
これにより、出力が tmp ファイルにダウンロードされ、ステータスが 200 の場合にのみ出力ファイルが作成/上書きされます。その期間、ファイルは空白のままになります。
提案する回避策があります。ファイルをダウンロードしますが、サイズが 0 の場合 (404 が発生した場合に発生します) も削除します。
wget -O <filename> <url/to/file>
if [[ (du <filename> | cut -f 1) == 0 ]]; then
rm <filename>;
fi;
これは zsh で機能しますが、他のシェルにも適用できます。
ただし、オプションを指定した場合、最初にのみ保存され-O
ます
別の方法として、一時的な回転ファイルを作成できます。
wget http://example.net/myfile.json -O myfile.json.tmp -t 3 -q && mv list.json.tmp list.json
前のコマンドは常にファイル「myfile.json.tmp」をダウンロードしますが、wget 終了ステータスが 0 の場合にのみ、ファイルは「myfile.json」としてローテーションされます。
このソリューションにより、ネットワーク障害が発生したときに最終ファイルが上書きされるのを防ぐことができます。
この方法の利点は、何か問題が発生した場合に一時ファイルを調べて、返されたエラー メッセージを確認できることです。
「-t」パラメータは、エラーが発生した場合にファイルのダウンロードを数回試みます。
「-q」はクワイエット モードであり、cron は wget の出力を報告するため、cron と一緒に使用することが重要です。
「-O」は、出力ファイルのパスと名前です。
Cron スケジュールでは、常にすべてのファイルのフル パスを提供することが非常に重要であり、この場合は "wget" プログラムのフル パスも提供することが非常に重要です。
注:これは古い質問であることは承知していますwget
が、上記の回答よりも優れた解決策を見つけたと思います。
wget -q $URL 2>/dev/null
HTTP ステータス コードが 200 の範囲内 (OK) である場合にのみ、ターゲット ファイルをローカル ディレクトリに保存します。
さらに、リクエストがエラーに遭遇したときにエラーを出力するようなことをしたい場合は、次のようにゼロ以外の値のwget 終了コードを確認できます。
wget -q $URL 2>/dev/null
if [ $? != 0]; then
echo "There was an error!"
fi
これが、私と同じ問題に直面している誰かに役立つことを願っています.
更新: 私はこれを自分のプロジェクト用によりスクリプト可能な形式に入れただけで、共有したいと思いました:
function dl {
pushd . > /dev/null
cd $(dirname $1)
wget -q $BASE_URL/$1 2> /dev/null
if [ $? != 0 ]; then
echo ">> ERROR could not download file \"$1\"" 1>&2
exit 1
fi
popd > /dev/null
}
"-O -"
オプションとして保存せずにファイルをダウンロードできます
wget -O - http://jagor.srce.hr/
詳細情報はhttp://www.gnu.org/software/wget/manual/wget.html#Advanced-Usageで入手できます。