Как вычислить хэш для строки (url) в bash для кэширования wget

Я создаю небольшой инструмент, который будет загружать файлы с помощью wget, читая URL-адреса из разных файлов. Тот же URL-адрес может присутствовать в разных файлах; url может даже присутствовать в одном файле несколько раз. Было бы неэффективно загружать страницу несколько раз (каждый раз, когда ее URL-адрес найден в списке (-ах)).

Таким образом, простой подход заключается в сохранении загруженного файла и инструкции wget не загружать его снова, если он уже существует.

Это было бы очень просто; однако URL-адреса очень длинные (многие параметры GET) и поэтому не могут использоваться как таковые для имен файлов (wget дает ошибку "Невозможно записать в... [] имя файла слишком долго" ).

Итак, мне нужно переименовать загруженные файлы. Но для того, чтобы механизм кэширования работал, для схемы переименования необходимо реализовать "одно url <= > одно имя": если данный URL-адрес может иметь несколько имен, кэширование не работает (т.е. Если я просто числю файлы в что они найдены, я не позволю wget определить, какие URL-адреса уже были загружены).

Простейшей схемой переименования будет вычисление хэша md5 имени файла (и не самого файла, что и делает md5sum); что обеспечило бы уникальность имени файла и что данный URL-адрес всегда имеет одно и то же имя.

Это возможно сделать в Perl и т.д., но можно ли это сделать непосредственно в bash или с помощью системной утилиты (RedHat)?

Ответ 1

Похоже, вы хотите использовать системную утилиту md5sum.

URLMD5=`/bin/echo $URL | /usr/bin/md5sum | /bin/cut -f1 -d" "`

Если вы хотите создать хэш только для имени файла, вы можете быстро это сделать с помощью sed:

FILENAME=`echo $URL | /bin/sed -e 's#.*/##'`
URLMD5=`/bin/echo $FILENAME | /usr/bin/md5sum | /bin/cut -f1 -d" "`

Ответ 2

У меня нет ответа, чтобы прокомментировать ответ, но есть одно пояснение к Epsilon Prime: по умолчанию эхо будет печатать новую строку в конце текста. Если вы хотите, чтобы суммы md5 совпадали с тем, что будет создано любым другим инструментом (например, php, Java md5 и т.д.), Вам нужно позвонить

echo -n "$url"

который будет подавлять новую строку.

Ответ 3

Другие опции в моем поле Ubuntu (Precise):

  • echo -n $STRING | sha512sum
  • echo -n $STRING | sha256sum
  • echo -n $STRING | sha224sum
  • echo -n $STRING | sha384sum
  • echo -n $STRING | sha1sum
  • echo -n $STRING | shasum

Другие параметры на моем Mac:

  • echo -n $STRING | shasum -a 512
  • echo -n $STRING | shasum -a 256
  • и др.

Ответ 4

Более новые версии Bash предоставляют ассоциативный массив, а также индексированный массив. Что-то вроде этого может сработать для вас:

declare -A myarray
myarray["url1"]="url1_content"
myarray["url2"]=""

if [ ! -z ${myarray["url1"]} ] ; then 
    echo "Cached";
fi

wget обычно переименовывает файлы с файлами filename.html.1,.2 и т.д., поэтому вы можете использовать ассоциативный массив для хранения списка, который был загружен, и того, что было фактическим именем файла.