是否有一个curl/wget 选项表示在出现http 错误时不保存文件?
题
我想在脚本中下载很多 URL,但我不想保存导致 HTTP 错误的 URL。
据我从手册页可以看出,两者都不是 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服务器无法交付文档时,它返回了So So的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响应代码),此选项将使卷曲重做新位置上的请求。[...]
古丝..来到这里寻找解决方案......最终编写了一些 shell 代码来完成它。
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,但您可以将其改编为其他 shell。
但如果您提供了,它只会将其保存在第一位 -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/
您可以在以下位置获取更多信息 http://www.gnu.org/software/wget/manual/wget.html#Advanced-Usage