我正在构建一个小工具,它将使用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)
这会压制换行符.
我的Ubuntu(精确)盒子上的其他选项:
echo -n $STRING | sha512sumecho -n $STRING | sha256sumecho -n $STRING | sha224sumecho -n $STRING | sha384sumecho -n $STRING | sha1sumecho -n $STRING | shasum我的Mac上的其他选项:
echo -n $STRING | shasum -a 512echo -n $STRING | shasum -a 256