我想在脚本中下载很多网址,但我不想保存导致HTTP错误的网址。
据我在手册页中可以看出,curl
或wget
都没有提供此类功能。
有谁知道另一个下载者呢?
答案 0 :(得分:17)
我认为-f
的{{1}}选项符合您的要求:
curl
,-f
(HTTP)服务器错误无提示失败(根本没有输出)。这主要是为了更好 启用脚本等以更好地处理失败的尝试。在正常情况下,当一个HTTP 服务器无法传递文档,它返回一个HTML文档(通常是这样) 还描述了为什么以及更多)。此标志将阻止curl输出该和 返回错误22. [...]
但是,如果响应实际上是301或302重定向,那么仍会保存,即使其目标会导致错误:
--fail
要关注重定向到其死胡同,还要提供$ 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
(HTTP / HTTPS)如果服务器报告所请求的页面已移至其他页面 位置(用Location:标题和3XX响应代码表示),此选项将 使curl重做新地方的请求。 [...]
答案 1 :(得分:13)
我为此目的设置了一个班轮:
(仅适用于单个文件,可能对其他人有用)
A=$$; ( wget -q "http://foo.com/pipo.txt" -O $A.d && mv $A.d pipo.txt ) || (rm $A.d; echo "Removing temp file")
这将尝试从远程主机下载文件。如果出现错误,则不保留该文件。在所有其他情况下,它被保留并重命名。
答案 2 :(得分:3)
古代线程..来到这里寻找解决方案......最后编写了一些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时才创建/覆盖输出文件。我的用例略有不同..在我的情况下输出采用&gt; 10秒生成...我不希望目标文件在该持续时间内保持空白。
答案 3 :(得分:0)
我有一个建议的解决方法,它确实下载了该文件,但如果它的大小为0,它也会删除它(如果发生404则会发生这种情况)。
wget -O <filename> <url/to/file>
if [[ (du <filename> | cut -f 1) == 0 ]]; then
rm <filename>;
fi;
它适用于zsh,但你可以适应其他shell。
但如果您提供-O
选项
答案 4 :(得分:0)
注意::我知道这是一个比较老的问题,但是我相信对于使用wget
的用户来说,找到了比以上任何一个答案都更好的解决方案。
wget -q $URL 2>/dev/null
仅当HTTP状态代码在200范围内(确定)时,才会将目标文件保存到本地目录。
此外,如果您想执行类似在遇到错误的请求时打印错误的操作,则可以检查wget exit code的非零值,如下所示:
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
}
答案 5 :(得分:0)
您也可以创建一个时间旋转文件:
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”。
此解决方案将防止在network failure occurs时覆盖最终文件。
此方法的优点是,万一发生错误,您可以检查时间文件并查看返回了什么错误消息。
如果出现错误,“-t”参数会尝试多次下载文件。
“-q”是安静模式,与cron一起使用很重要,因为cron将报告wget的任何输出。
“-O”是输出文件的路径和名称。
请记住,对于Cron计划,始终提供所有文件的完整路径非常重要,在这种情况下,还必须为其提供“ wget”程序的完整路径。
答案 6 :(得分:-3)
您可以使用"-O -"
选项
wget -O - http://jagor.srce.hr/
您可以在http://www.gnu.org/software/wget/manual/wget.html#Advanced-Usage
获取mor信息