PHP脚本,用于检查目录中所有文件的SHA1或MD5哈希,以防止从XML文件中删除的校验和;递归,循环

时间:2015-03-14 12:58:21

标签: php linux md5 sha1 checksum

我已经完成bulk download from archive.org using wget设置为将每个IDENTIFIER的所有文件列表吐出到各自的文件夹中。

wget -r -H -nc -np -nH -e robots=off -l1 -i ./itemlist.txt -B 'http://archive.org/download/'

这导致从根目录组织文件夹,例如:

./IDENTIFIER1/file.blah
./IDENTIFIER1/something.la
./IDENTIFIER1/thumbnails/IDENTIFIER_thumb001.gif
./IDENTIFIER1/thumbnails/IDENTIFIER_thumb002.gif
./IDENTIFIER1/IDENTIFIER_files.xml

./IDENTIFIER2/etc.etc
./IDENTIFIER2/blah.blah
./IDENTIFIER2/thumbnails/IDENTIFIER_thumb001.gif

 etc

IDENTIFIER是来自archive.org的文件集合的名称,因此,在每个文件夹中,还有一个名为IDENTIFIER_files.xml的文件,其中包含所有文件的校验和。文件夹,包装在各种xml标签中。

由于这是批量下载并且有数百个文件,因此我们的想法是编写一些可以选择每个文件的脚本(最好是bash?编辑:可能是PHP?)。 xml文件并抓取它以便对文件进行测试以显示任何损坏,失败或修改的下载。

例如:

从archive.org/details/NuclearExplosion,XML是:

https://archive.org/download/NuclearExplosion/NuclearExplosion_files.xml

如果检查该链接,您可以看到XML中的MD5或SHA1哈希选项,以及文件标记中的相对文件路径(与本地相同)。 / p>

因此。我们如何:

  1. 对于IDENTIFIER的每个文件夹,选择并抓取每个文件名的XML和所选的校验和;

  2. 实际测试每个文件的校验和;

  3. 将失败的校验和的输出记录到仅列出失败的IDENTIFIER的文件(例如,称为./RetryIDs.txt的文件),因此可以使用该列表尝试下载重新尝试。

    wget -r -H -nc -np -nH -e robots=off -l1 -i ./RetryIDs.txt -B 'http://archive.org/download/'
    
  4. 任何关于如何将它拼凑在一起的线索都会非常有帮助。

    另一个额外的激励 - 如果有解决方案,也许是一个好主意,如果我们让archive.org知道,那么他们可以把它放在他们的博客上。我确定我不是唯一会发现这非常有用的人!

    先谢谢大家。


    编辑:好的,所以bash脚本看起来很棘手。可以用PHP完成吗?

1 个答案:

答案 0 :(得分:3)

如果你真的想要走bash路线,这就是你开始做的事情。您可以使用xml2工具套件将XML转换为更易于修改传统shell脚本的工具,然后执行以下操作:

#!/bin/sh

xml2 < $1 | awk -F= '
    $1 == "/files/file/@name" {name=$2}
    $1 == "/files/file/sha1" {
        sha1=$2
        print name, sha1
    }
'

这将在标准输出上生成一个文件名列表及其对应的SHA1校验和。这应该让你更接近解决方案。

实际上,使用该输出来验证文件是留给读者的练习。