是否存在curl / wget选项,表示不会在http错误时保存文件?

scripting curl wget

21580 观看

6回复

1490 作者的声誉

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

据我可以从手册页告诉,既不curlwget提供这样的功能。有谁知道另一个下载者呢?

作者: akiva 的来源 发布者: 2008 年 9 月 18 日

回应 (6)


16

113487 作者的声誉

我认为-f可以选择curl做你想做的事情:

-f--fail

(HTTP)服务器错误无提示失败(根本没有输出)。这主要是为了更好地启用脚本等以更好地处理失败的尝试。在正常情况下,当HTTP服务器无法传递文档时,它会返回一个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)如果服务器报告请求的页面已移动到其他位置(用Location:标头和3XX响应代码表示),则此选项将使curl重做新位置的请求。[...]

作者: Thomas 发布者: 18.09.2008 04:26

13

1304 作者的声誉

决定

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

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

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

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

作者: Oct 发布者: 24.02.2010 03:19

-3

13 作者的声誉

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

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

您可以访问http://www.gnu.org/software/wget/manual/wget.html#Advanced-Usage获取mor信息

作者: Marc Queralt 发布者: 21.11.2011 09:20

3

513 作者的声誉

古老的线程..来到这里寻找解决方案......最终写了一些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秒来生成...而我不想要目的地文件在该持续时间内保持空白。

作者: sajal 发布者: 30.03.2015 03:21

0

4758 作者的声誉

我有一个建议的解决方法,它确实下载了文件,但如果它的大小为0(如果发生404则会发生)它也会删除它。

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

它适用于zsh,但你可以适应其他shell。

但是如果你提供-O选项,它只会将它保存在第一位

作者: vmonteco 发布者: 11.04.2016 07:05

0

310 作者的声誉

注意:我知道这是一个较老的问题,但我相信我找到了wget比上述任何答案提供的更好的解决方案。

wget -q $URL 2>/dev/null

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

此外,如果您希望在遇到错误请求时执行类似打印错误的操作,则可以检查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
}
作者: Chef Cyanide 发布者: 02.03.2019 07:11
32x32