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

问题描述 投票:15回答:4

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

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

这将非常简单;但是url非常长(许多GET参数),因此不能用于文件名(wget给出错误'无法写入... []文件名太长')。

所以,我需要重命名下载的文件。但是要使缓存机制起作用,重命名方案需要实现“一个url <=>一个名称”:如果给定的URL可以有多个名称,则缓存不起作用(即,如果我只是按顺序对文件进行编号)他们被发现,我不会让wget识别哪些网址已被下载)。

最简单的重命名方案是计算文件名的md5哈希值(而不是文件本身的哈希值,这是md5sum所做的);这将确保文件名是唯一的,并且给定的URL将始终具有相同的名称。

可以在Perl等中执行此操作,但是可以直接在bash中使用或使用系统实用程序(RedHat)吗?

bash md5 wget
4个回答
29
投票

听起来你想要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" "`

请注意,根据您的分布,cut的路径可能是/usr/bin/cut


10
投票

我没有代表对答案发表评论,但有一个澄清Epsilon Prime的答案:默认情况下,echo会在文本末尾打印换行符。如果你想让md5总和与任何其他工具(例如php,Java的md5等)生成的内容相匹配,你需要调用

echo -n "$url"

这会压制换行符。


6
投票

我的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
  • 等等

1
投票

较新版本的Bash提供了一个关联数组,以及一个索引数组。这样的事可能适合你:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.