代码之家  ›  专栏  ›  技术社区  ›  akiva

是否有一个curl/wget选项表示在出现http错误时不保存文件?

  •  18
  • akiva  · 技术社区  · 18 年前

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

    从手册页上看,两者都不是 curl 或 wget 有人知道另一个下载者是谁吗?

    5 回复  |  直到 5 年前
        1
  •  26
  •   Thomas    11 年前

    我认为 -f 选择 curl 你想要什么

    , --fail

    (HTTP)在服务器错误时以静默方式失败(根本没有输出)。这样做主要是为了更好 启用脚本等以更好地处理失败的尝试。在正常情况下,当HTTP 服务器无法传递文档,它会返回一个HTML文档,说明是这样的(通常是这样的)

    但是,如果响应实际上是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

    位置(用位置:标题和3XX响应代码指示),此选项将 让curl在新位置上重做请求。[...]

        2
  •  15
  •   Oct    13 年前

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

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

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

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

        3
  •  3
  •   Mira Weller    9 年前

    古老的线索。。降落在这里寻找解决方案。。。最后写了一些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秒后生成。。。我不希望目标文件在此期间保持空白。

        4
  •  0
  •   vmonteco    10 年前

    我提出了一个解决方案,它确实下载了文件,但如果文件大小为0(如果出现404,就会发生这种情况),它也会删除文件。

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

    但只有在您提供 -O

        5
  •  0
  •   user5739133 user5739133    7 年前

    注: 我知道这是一个老问题,但我相信我已经为那些使用 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
    }
    
        6
  •  0
  •   Juan Lago    6 年前

    作为替代方案,您可以创建临时旋转文件:

    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”。

    network failure occurs .

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

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

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

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

        7
  •  -3
  •   Mp0int    14 年前

    您可以下载该文件,而无需使用 "-O -"

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

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

    推荐文章