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

Bam*_*bax 17 bash md5 wget

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

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

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

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

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

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

Eps*_*ime 30

听起来你想要md5sum系统实用程序.

URLMD5=`/bin/echo $URL | /usr/bin/md5sum | /bin/cut -f1 -d" "`
Run Code Online (Sandbox Code Playgroud)

如果您只想在文件名上创建哈希,可以使用sed快速获得:

FILENAME=`echo $URL | /bin/sed -e 's#.*/##'`
URLMD5=`/bin/echo $FILENAME | /usr/bin/md5sum | /bin/cut -f1 -d" "`
Run Code Online (Sandbox Code Playgroud)


use*_*466 10

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

echo -n "$url"
Run Code Online (Sandbox Code Playgroud)

这会压制换行符.


kda*_*ria 7

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