如何在 bash 中计算字符串(url)的哈希值以进行 wget 缓存
题
我正在构建一个小工具,可以使用 wget 下载文件,读取不同文件中的 url。相同的 url 可能存在于不同的文件中;该 url 甚至可能在一个文件中多次出现。多次下载一个页面(每次在列表中找到其 URL 时)的效率会很低。
因此,简单的方法是保存下载的文件并指示 wget 如果已经存在则不要再次下载它。
那会非常简单;然而,url 非常长(很多 GET 参数),因此不能用作文件名(wget 给出错误“无法写入...”[] 文件名太长')。
所以,我需要重命名下载的文件。但为了让缓存机制发挥作用,重命名方案需要实现“一个 url <=> 一个名称”:如果给定的 url 可以有多个名称,则缓存不起作用(即,如果我只是按照找到的顺序对文件进行编号,我不会让 wget 识别哪些 url 已被下载)。
最简单的重命名方案是计算 md5 哈希值 文件名的 (和 不是 文件本身,这就是 md5sum 的作用);这将确保文件名是唯一的,并且给定的 url 始终会产生相同的名称。
可以在 Perl 等中完成此操作,但可以直接在 bash 中或使用系统实用程序(RedHat)完成吗?
解决方案
听起来你想要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
。
其他提示
我没有代表对答案发表评论,但有一个澄清Epsilon Prime的答案:默认情况下,echo会在文本末尾打印换行符。如果你想让md5总和与任何其他工具(例如php,Java的md5等)生成的内容相匹配,你需要调用
echo -n "$url"
会抑制换行符。
我的 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
- ETC。
较新版本的 Bash 提供了一个关联数组,以及一个索引数组。这样的事可能适合你:
declare -A myarray
myarray["url1"]="url1_content"
myarray["url2"]=""
if [ ! -z ${myarray["url1"]} ] ; then
echo "Cached";
fi
wget通常会使用filename.html.1,.2等重命名文件,因此您可以使用关联数组来存储已下载哪个文件以及实际文件名是什么的列表。