【问题标题】:wget: delete incomplete fileswget:删除不完整的文件
【发布时间】:2015-07-03 22:07:34
【问题描述】:

我目前正在使用 bash 脚本通过 wget 下载多个图像。

不幸的是,我从中下载的服务器不太可靠,因此有时当我下载文件时,服务器会断开连接,脚本将移动到下一个文件,而前一个文件不完整。

为了解决这个问题,我尝试在脚本获取所有不完整的文件后添加第二行:

wget -c myurl.com/image{1..3}.png

这似乎可以工作,因为 wget 返回并完成文件的下载,但问题来自于此:我用来将图像拼接成 pdf 的 ImageMagick,声称图像的标题存在错误。

我对删除不完整文件的想法是:

wget myurl.com/image{1..3}.png
wget -rmincompletefiles
wget -N myurl.com/image{1..3}.png
convert *.png mypdf.pdf

所以问题是,我可以用什么来代替实际存在的-rmincompletefiles,还是有更好的方法来解决这个问题?

【问题讨论】:

  • 我想我不明白镜像如何帮助我完成我想做的事情。

标签: bash wget


【解决方案1】:

在尝试实现tvm's suggestion 时,我发现了一个令人惊讶的发现。

事实证明,这是我没有意识到的,当您运行 wget -N 时,wget 实际上会检查文件大小并验证它们是否相同。如果不是,则文件将被删除,然后再次下载。

如果您遇到与我相同的问题,那么非常棒的提示!

【讨论】:

  • wget -N 检查服务器上的时间戳。时间戳是 wget 设置的最后一项,在文件完全下载后,这意味着几乎可以保证任何部分下载的文件都有不同的时间戳。问题是,wget -N 不会重新下载文件,因为它几乎肯定会在服务器上看到更早的时间戳,并得出本地文件更新的结论。你会得到一个看起来像这样的错误:File ‘somefile.mp3’ not modified on server. Omitting download. wget -N 如果服务器没有返回时间戳,可能对你有用。
【解决方案2】:

我发现 this solution 适合我的用例。

来自答案:

wget http://www.example.com/mysql.zip -O mysql.zip || rm -f mysql.zip

这样,只有在发生错误或取消时才会删除文件。

【讨论】:

    【解决方案3】:

    好吧,我会尽量用wget 下载文件(你可以指定额外的参数,比如更大的--timeout 给服务器一些额外的时间)。 wget 假设有关部分下载的某些事情,即使有适当的恢复,它们有时也会最终损坏(除非您通过其他方式检查它们的例如 MD5 总和)。

    由于您使用的是 convertbash,因此很可能会从 Imagemagick 包中获得另一个工具 - 即 identify

    虽然某些功能的文档记录确实很差,但它有一个很棒的功能 - 它可以识别损坏的(或部分下载的图像)。

    ➜  ~  identify b.jpg; echo $?
    identify.im6: Invalid JPEG file structure: ...
    1
    

    如果您在不一致的图像上调用它,它将返回退出状态 1。您可以使用简单的循环删除这些不一致的图像,例如:

    for i in *.png;
       do identify "$i" || rm -f "$i";
    done
    

    然后我会尝试再次下载损坏的文件。

    【讨论】:

    • 这个解决方案的问题是,identify 实际上接受了我部分下载的图像。我不知道为什么,但它确实然后尝试将它们传递给转换,返回 convert: corrupt image 2.png @ error/png.c/ReadPNGImage/3958.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多