25

我想在脚本中下载很多 url,但我不想保存导致 HTTP 错误的那些。

据我从手册页中可以看出,既不提供curl也不wget提供此类功能。有人知道另一个下载者吗?

4

7 回答 7

26

我认为-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 在新位置重做请求。[...]

于 2008-09-18T04:26:38.147 回答
15

我刚刚为此目的设置了一个班轮:

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

A=$$; ( wget -q "http://foo.com/pipo.txt" -O $A.d && mv $A.d pipo.txt ) || (rm $A.d; echo "Removing temp file")

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

于 2010-02-24T15:19:01.897 回答
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 时创建/覆盖输出文件。我的用例略有不同..在我的情况下,输出需要 > 10 秒才能生成......而且我不想要目的地文件在这段时间内保持空白。

于 2015-03-30T15:21:57.753 回答
0

我有一个解决方法要提议,它确实会下载文件,但如果它的大小为 0,它也会将其删除(如果发生 404,则会发生这种情况)。

wget -O <filename> <url/to/file>
if [[ (du <filename> | cut -f 1) == 0 ]]; then
    rm <filename>;
fi;

它适用于 zsh,但您可以将其调整为适用于其他 shell。

-O但是,如果您提供选项,它只会将其保存在首位

于 2016-04-11T19:05:33.547 回答
0

注意:我知道这是一个较老的问题,但我相信我已经为那些使用的人找到了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
}
于 2019-03-02T07:11:23.913 回答
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”。

此解决方案将防止在发生网络故障时覆盖最终文件。

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

“-t”参数会尝试多次下载文件以防出错。

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

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

请记住,对于 Cron 计划,始终为所有文件提供完整路径非常重要,在这种情况下,对于它自身的“wget”程序也是如此。

于 2020-02-19T13:59:16.113 回答
-3

您可以下载文件而不使用"-O -"选项保存为

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

您可以在http://www.gnu.org/software/wget/manual/wget.html#Advanced-Usage获得更多信息

于 2011-11-21T21:20:54.710 回答