создание скрипта загрузки файла с проверкой контрольной суммы
Я хочу создать shellscript, который читает файлы из a .diz-файл, в котором хранится информация о различных исходных файлах, необходимых для компиляции определенного программного обеспечения (в данном случае imagemagick). я использую Mac OSX Leopard 10.5 для этих примеров.
В основном я хочу иметь простой способ поддерживать их .diz файлов, которые содержат информацию по актуальной пакетов с исходным кодом. мне просто нужно будет обновить их .диз-файлы с URL-адресами, информацией о версии и файлом контрольная сумма.
Пример строки:
libpng:1.2.42:libpng-1.2.42.tar.bz2?use_mirror=biznetnetworks:http://downloads.sourceforge.net/project/libpng/00-libpng-stable/1.2.42/libpng-1.2.42.tar.bz2?use_mirror=biznetnetworks:9a5cbe9798927fdf528f3186a8840ebe
Часть сценария:
while IFS=: read app version file url md5
do
echo "Downloading $app Version: $version"
curl -L -v -O $url 2>> logfile.txt
$calculated_md5=`/sbin/md5 $file | /usr/bin/cut -f 2 -d "="`
echo $calculated_md5
done < "files.diz"
На самом деле у меня есть не только один вопрос, касающийся этого.
- Как рассчитать и сравнить контрольные суммы лучше всего? я хотел хранить контрольные суммы md5 в .диз файла и сравнить его со строкой сравнения с "вырезать" Тинг из строки
- Есть ли способ указать curl другое имя файла для сохранения? (в моем случае имя файла становится уродливым libpng-1.2.42.тар.bz2 файл?use_mirror=biznetnetworks)
- у меня, кажется, есть проблемы с обратными указателями, которые должны направлять вывод конвейерного md5 и врезаться в переменную $calculated_md5. синтаксис неправильный?
Спасибо!
3 ответа:
while IFS=: read app version file url md5 do echo "Downloading $app Version: $version" #use -o for output file. define $outputfile yourself curl -L -v $url -o $outputfile 2>> logfile.txt # use $(..) instead of backticks. calculated_md5=$(/sbin/md5 "$file" | /usr/bin/cut -f 2 -d "=") # compare md5 case "$calculated_md5" in "$md5" ) echo "md5 ok" echo "do something else here";; esac done < "files.diz"
Следующий практический однострочный:
curl -s -L <url> | tee <destination-file> | sha256sum -c <(echo "a748a107dd0c6146e7f8a40f9d0fde29e19b3e8234d2de7e522a1fea15048e70 -") || rm -f <destination-file>
Обертывание его в функцию, принимающую 3 аргумента: - url-адрес - место назначения - sha256
download() { curl -s -L $1 | tee $2 | sha256sum -c <(echo "$3 -") || rm -f $2 }
Мой
curl
имеет-o
(--output
) возможность указать выходной файл. Есть также проблема с вашим назначением в$calculated_md5
. У него не должно быть знака доллара спереди, когда вы назначаете его. У меня здесь нет/sbin/md5
, поэтому я не могу это комментировать. То, что у меня есть, - этоmd5sum
. Если он у вас тоже есть, вы можете рассмотреть его как альтернативу. В частности, он имеет опцию--check
, которая работает из списка файлов md5sums, что может быть удобно для вашей ситуации. ХТ.