httpエラー時にファイルを保存しないように指示するcurl/wgetオプションはありますか?
質問
スクリプトで大量の URL をダウンロードしたいのですが、HTTP エラーにつながる URL は保存したくありません。
manページから知る限り、どちらも curl
または wget
そのような機能を提供します。誰か別のダウンローダーについて知っている人はいますか?
解決
まさにこの目的のためにセットアップしたワンライナー:
(単一のファイルでのみ機能しますが、他のファイルにも役立つ可能性があります)
A=$$; ( wget -q "http://foo.com/pipo.txt" -O $A.d && mv $A.d pipo.txt ) || (rm $A.d; echo "Removing temp file")
これにより、リモート ホストからファイルのダウンロードが試行されます。エラーが発生した場合、ファイルは保持されません。それ以外の場合はすべて、名前が変更されて保持されます。
他のヒント
私は思います -f
というオプション curl
あなたが望むことをします:
-f
,--fail
(HTTP) サーバー エラー時にサイレントに失敗します (何も出力されません)。これは主に、スクリプトなどをより適切に有効にするために行われ、失敗した試みをよりよく扱うことができます。HTTPサーバーがドキュメントの配信に失敗した場合の通常の場合、HTMLドキュメントを返すようにしています(多くの場合、その理由も説明します)。このフラグは、カールがそれを出力するのを防ぎ、エラー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)サーバーが要求されたページが別の場所に移動したと報告している場合(場所で示されています:ヘッダーと3xx応答コード)、このオプションは、新しい場所でリクエストをCurl Redoにします。[...]
古代の糸..解決策を探してここにたどり着きました...結局、それを行うためのシェルコードを書くことになりました。
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 の場合にのみ出力ファイルが作成/上書きされます。私の使用例は少し異なります。私の場合、出力の生成には 10 秒以上かかります...その間、宛先ファイルが空白のままになることは望ましくありませんでした。
提案する回避策があります。ファイルはダウンロードされますが、サイズが 0 の場合は削除されます (404 が発生した場合に発生します)。
wget -O <filename> <url/to/file>
if [[ (du <filename> | cut -f 1) == 0 ]]; then
rm <filename>;
fi;
zsh では機能しますが、他のシェルにも適応できます。
ただし、最初の場所で保存されるのは、 -O
オプション
注記: これが古い質問であることは承知していますが、使用している人にとってより良い解決策を見つけたと信じています。 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/
詳細については、次の URL で入手できます。 http://www.gnu.org/software/wget/manual/wget.html#Advanced-Usage