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

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

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

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

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

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

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

4 ответов


Похоже, вам нужна системная утилита 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" "`

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

echo -n "$url"

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


другие параметры в моем Ubuntu (точном) поле:

  • 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
  • etc.

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

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

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

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