是否有命令行方法可以用来检查下载的文件是否完整或损坏?


13

我正在编写一个涉及下载和处理文件的脚本,并且我想确保在处理该文件之前该文件不是不完整的(例如由于连接断开)。

Answers:


10

验证下载文件完整性的最常用方法是使用MD5校验和。假设您正在从其文件的实际发布的MD5校验和中下载的站点。您可以通过创建自己的下载文件校验和并将其与发布的校验和进行比较来验证MD5校验和。如果它们相同,则您已下载的文件已完成并且未被篡改。

如果您不希望下载的文件发生更改,则可以预先计算校验和并将其硬编码到脚本中,但是如果文件已更新,则验证将失败。

要创建文件的MD5校验和,请运行md5sum myFile。对于wget,您可能会发现此命令很有用,尤其是当您下载的文件很大时:

wget -O - http://example.com/myFile | tee myFile | md5sum > MD5SUM

这将在下载时创建“ myFile”的校验和,并将其保存到文件MD5SUM中,可能节省您一些时间。

在断开连接的情况下,我认为最好的方法是检查wget的退出代码。如果下载成功,没有任何错误,则wget将返回0。其他任何指示都出了问题。查看中的“退出状态”部分man wget



7

用于下载文件的命令的返回码将告诉您命令是否成功执行。通常,返回码0表示成功,任何非零数字表示错误。您可以通过$?变量访问返回码。

使用的一个基本示例wget将是:

#!/bin/bash

wget foo.tgz &> /dev/null

if [[ "$?" != 0 ]]; then
    echo "Error downloading file"
else
    echo "Success"
fi

&> /dev/null将所有wget的输出重定向到,/dev/null因此非常适合编写脚本,但是这会使调试wget错误更加困难。


4
您可以改为:wget -q ... || { handle ; error ; }
mikeserv

@mikeserv甚至都不知道那里,很好的感觉
Creek

1
只是在man通读答案时才发现它,而我要说的两件事已经在两个答案中了-所以我做了两个评论。也很高兴给您。
mikeserv 2014年

我希望将其与tor等SOCKS代理一起使用时不起作用。
CodesInChaos 2014年

1
@Creek我的意思是wget即使下载失败,也可能认为下载已完成。代理有关断开的TCP连接与关闭的TCP连接的信息,这对于HTTP来说是有问题的,因为默认情况下它使用关闭的TCP作为结束标记。这就是为什么当我进行大量下载时,我添加了检查标题中的文件大小是否与下载的文件大小匹配的原因。不知道是否进行了wget这种一致性检查,或者不确定http规范在此问题上怎么说。
CodesInChaos 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.