22

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

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

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

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

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

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

4

4 回答 4

37

听起来您想要 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.

于 2009-10-21T17:41:17.597 回答
12

我的 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
  • 等等
于 2015-06-05T21:46:45.163 回答
11

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

echo -n "$url"

这将抑制换行符。

于 2011-11-19T14:42:29.643 回答
1

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

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

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

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

于 2009-10-21T17:58:38.603 回答