linux — скрипт PHP, который проверяет хэши SHA1 или MD5 для всех файлов в каталоге по контрольным суммам, извлеченным из файла XML; рекурсивный, петлевой

Я сделал массовая загрузка с archive.org с использованием 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, так и относительные пути к файлам в теге файла (которые будут такими же, как и локально).

Так. Как мы:

  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/'
    

Любые выводы о том, как собрать это воедино, будут чрезвычайно полезны.

И еще один дополнительный стимул — вероятно, хорошая идея, если есть решение, если мы сообщим об этом archive.org, чтобы они могли разместить его в своем блоге. Я уверен, что я не единственный, кто найдет это очень полезным!

Спасибо всем заранее.


Редактировать: Хорошо, сценарий bash выглядит сложно. Можно ли это сделать с помощью PHP?

0

Решение

Если вы действительно хотите пойти bash маршрут, вот что-то для тебя началось. Вы можете использовать xml2 набор инструментов для преобразования XML во что-то более подходящее для традиционных сценариев оболочки, а затем сделать что-то вроде этого:

#!/bin/sh

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

Это приведет к стандартному выводу списка имен файлов и их соответствующей контрольной суммы SHA1. Это должно существенно приблизить вас к решению.

На самом деле использование этого вывода для проверки файлов оставлено читателю в качестве упражнения.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]