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

问题描述 投票:0回答:7

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

据我从手册页中可以看出,

curl
wget
均不提供此类功能。 有人知道另一个下载器吗?

scripting curl wget
7个回答
32
投票

我认为

-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在新的地方重做请求。 [...]


15
投票

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

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

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

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


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 秒才能生成...并且我不希望目标文件在此期间保持空白。


1
投票

注意:我知道这是一个较旧的问题,但我相信我已经为那些使用

wget
的人找到了比上述任何答案提供的更好的解决方案。

wget -q $URL 2>/dev/null

当且仅当 HTTP 状态码在 200 范围内时才会将目标文件保存到本地目录(Ok)。

此外,如果您想做一些事情,例如在请求遇到错误时打印出错误,您可以检查 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
}

0
投票

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

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

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

但是,如果您提供

-O
选项,它只会将其保存在第一位


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”程序本身提供完整路径。


-3
投票

您可以使用

"-O -"
选项下载文件而不保存为

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

您可以在 http://www.gnu.org/software/wget/manual/wget.html#Advanced-Usage

获取更多信息
© www.soinside.com 2019 - 2024. All rights reserved.