создание скрипта загрузки файла с проверкой контрольной суммы


Я хочу создать 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"

На самом деле у меня есть не только один вопрос, касающийся этого.

  1. Как рассчитать и сравнить контрольные суммы лучше всего? я хотел хранить контрольные суммы md5 в .диз файла и сравнить его со строкой сравнения с "вырезать" Тинг из строки
  2. Есть ли способ указать curl другое имя файла для сохранения? (в моем случае имя файла становится уродливым libpng-1.2.42.тар.bz2 файл?use_mirror=biznetnetworks)
  3. у меня, кажется, есть проблемы с обратными указателями, которые должны направлять вывод конвейерного md5 и врезаться в переменную $calculated_md5. синтаксис неправильный?

Спасибо!

3 2

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, что может быть удобно для вашей ситуации. ХТ.