代码之家  ›  专栏  ›  技术社区  ›  Bambax

如何在用于wget缓存的bash中计算字符串(url)的哈希

  •  12
  • Bambax  · 技术社区  · 15 年前

    我正在构建一个小工具,可以使用wget下载文件,从不同的文件中读取URL。同一个URL可能出现在不同的文件中;该URL甚至可能多次出现在一个文件中。多次下载一个页面(每次在列表中找到该页面的URL时)会降低效率。

    因此,简单的方法是保存下载的文件,并指示wget如果已经存在,不要再下载它。

    这将非常简单;但是URL非常长(许多get参数),因此不能用于文件名(wget给出错误“cannot write to…”[]文件名太长')。

    所以,我需要重命名下载的文件。但是,为了使缓存机制工作,重命名方案需要实现“一个URL<=>一个名称”:如果一个给定的URL可以有多个名称,则缓存将无法工作(即,如果我只是按照找到的顺序对文件进行编号,则不会让wget标识已下载的URL)。

    最简单的重命名方案是计算MD5哈希 文件名的 (和) 文件本身,MD5SUM就是这样做的);这将确保文件名是唯一的,并且给定的URL总是产生相同的名称。

    在Perl等语言中也可以这样做,但是可以直接在bash中完成还是使用系统实用程序(RedHat)?

    4 回复  |  直到 9 年前
        1
  •  25
  •   Epsilon Prime    15 年前

    听起来您需要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
  •  9
  •   user1043466    13 年前

    我没有代表对答案发表评论,但对epsilon prime的答案有一个澄清:默认情况下,echo将在文本结尾处打印新行。如果希望MD5和匹配任何其他工具(如PHP、Java的MD5等)所需的调用,则需要调用

    echo -n "$url"
    

    这将禁止换行。

        3
  •  5
  •   kdauria    9 年前

    我的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
    • 等。
        4
  •  1
  •   Kaleb Pederson    15 年前

    的更新版本 Bash 提供关联数组和索引数组。这样的事情可能对你有用:

    declare -A myarray
    myarray["url1"]="url1_content"
    myarray["url2"]=""
    
    if [ ! -z ${myarray["url1"]} ] ; then 
        echo "Cached";
    fi
    

    wget通常会将文件重命名为.html.1、.2等文件名,因此您可以使用关联数组来存储已下载文件的列表以及实际文件名。