Scripting 是否有curl/wget选项可以防止在出现http错误时保存文件?

Scripting 是否有curl/wget选项可以防止在出现http错误时保存文件?,scripting,curl,wget,Scripting,Curl,Wget,我想在脚本中下载很多URL,但我不想保存导致HTTP错误的URL 就我从手册页所知,curl或wget都没有提供这样的功能。 有人知道另一个下载者是谁吗?我认为-f选项curl可以满足您的需求: -f,-fail (HTTP)在服务器错误时以静默方式失败(根本没有输出)。这样做主要是为了更好 启用脚本等以更好地处理失败的尝试。在正常情况下,当HTTP 服务器无法传递文档,它会返回一个HTML文档,说明是这样的(通常是这样的) 还描述了原因和更多)。此标志将防止curl输出该和 返回错误22。[…

我想在脚本中下载很多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>
$curl-fOhttp://google.com/aoeu
$cat aoeu
301移动
301移动
文档已移动
.
要遵循重定向到其死胡同,请同时提供
-L
选项:

-L
-位置

(HTTP/HTTPS)如果服务器报告请求的页面已移动到其他位置 位置(用位置:标题和3XX响应代码指示),此选项将 让curl在新位置上重做请求。[……]


我刚刚为此目的设置了一个衬里:

(仅适用于单个文件,可能对其他文件有用)


这将尝试从远程主机下载文件。如果出现错误,则不会保留该文件。在所有其他情况下,都会保留并重命名该文件。

您可以使用
“-O-”
选项下载该文件,而无需将其保存为

wget -O - http://jagor.srce.hr/

您可以从古代线程获取更多信息。。降落在这里寻找解决方案。。。最后写了一些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
如果[(du | cut-f1)==0];然后
rm;
fi;
它适用于zsh,但您可以将其用于其他shell


但是,只有当您提供
-O
选项时,才可以将其保存在第一位。注意:我知道这是一个较老的问题,但我相信我为使用
wget
的人找到了比上述任何答案更好的解决方案

wget-q$URL 2>/dev/null
当且仅当HTTP状态代码在200范围内(Ok)时,才会将目标文件保存到本地目录

此外,如果您希望在请求遇到错误时执行诸如打印错误之类的操作,则可以检查以下非零值:

wget-q$URL 2>/dev/null
如果[$?!=0];然后
echo“有一个错误!”
fi
我希望这对那些面临与我同样问题的人有所帮助

更新: 我只是把它放在我自己的项目中更适合编写脚本的形式中,并想与大家分享:

函数dl{
pushd.>/dev/null
cd$(目录名$1)
wget-q$BASE\u URL/$12>/dev/null
如果[$?!=0];则
echo“>>错误无法下载文件\“$1\”1>&2
出口1
fi
popd>/dev/null
}

您也可以创建一个临时旋转文件:

wget http://example.net/myfile.json -O myfile.json.tmp -t 3 -q && mv list.json.tmp list.json
前面的命令将始终下载文件“myfile.json.tmp”,但是只有当wget exit状态等于0时,文件才会旋转为“myfile.json”

此解决方案将防止在出现错误时覆盖最终文件

这种方法的优点是,如果出现问题,您可以检查临时文件并查看返回的错误消息

如果出现错误,“-t”参数会多次尝试下载文件

“-q”是安静模式,与cron一起使用很重要,因为cron将报告wget的任何输出

“-O”是输出文件路径和名称


请记住,对于Cron计划,始终为所有文件提供完整路径非常重要,在本例中,“wget”程序也需要提供完整路径。

否,这只与错误的详细程度有关。一旦使用,就不会报告错误(但会像往常一样保存)。无论如何,这正是我想要的(
curl-fO{URL}
)。它不会将文件保存在
404
上。感谢you@hypercrypt你的评论把我弄糊涂了,直到我意识到发生了什么。在一个重要的警告中编辑。
-fLO
是我现在最喜欢的卷发标志:)
curl-fLOhttp://google.com/aoeu
=>
curl:(22)请求的URL返回错误:404未找到
IMO,这应该是可接受的答案。非常感谢。你的意思是说“如果有错误,文件就不会保存”?否则你做了与要求相反的事。这不是OP要求的。他要求提供一种在出现错误时不下载文件的方法。你的答案从来没有下载过任何东西。据我所知,Oct是唯一一个真正阅读并回答了问题的人。其他人给了你永远不会下载任何东西的技术,或者他们说你可以自己下载。你不应该接受你得到的唯一真实答案吗?忘了提一下:不要使用
-O
标志调用
wget
,这很重要
-O
将始终创建一个新文件,而不管请求状态如何,尽管它通常不会在文件出错时放入任何内容。
wget -O <filename> <url/to/file>
if [[ (du <filename> | cut -f 1) == 0 ]]; then
    rm <filename>;
fi;
wget http://example.net/myfile.json -O myfile.json.tmp -t 3 -q && mv list.json.tmp list.json