我有一个shell脚本。一个cron作业每天运行一次。目前它只是使用wget从网上下载一个文件,附加一个时间戳到文件名,然后压缩它。基本的东西。bash scripting de-dupe
虽然这个文件并不经常改变,所以我想放弃下载的文件,如果它已经存在。
最简单的方法来做到这一点?
谢谢!
我有一个shell脚本。一个cron作业每天运行一次。目前它只是使用wget从网上下载一个文件,附加一个时间戳到文件名,然后压缩它。基本的东西。bash scripting de-dupe
虽然这个文件并不经常改变,所以我想放弃下载的文件,如果它已经存在。
最简单的方法来做到这一点?
谢谢!
你真的需要压缩文件吗?
wget
提供了-N, --timestamping
显然,打开时间戳。什么,做是说你的文件位于www.example.com/file.txt
当你第一次做:
$ wget -N www.example.com/file.txt
[...]
[...] file.txt saved [..size..]
下一次它会是这样的:
$ wget -N www.example.com/file.txt
Server file no newer than local file “file.txt” -- not retrieving.
除非服务器上的文件已更新。
如果您没有压缩文件,这将解决您的问题。
如果你真的需要压缩它,那么我想我会去比较新文件/存档和旧的散列。在这种情况下,重要的是,下载的文件有多大?是否值得先压缩然后检查哈希值?值得解压缩旧的存档并比较哈希值吗?将旧的散列存储在txt文件中更好吗?所有这些比覆盖旧文件有优势吗?
你只知道,做一些测试。
所以,如果你走哈希方式,考虑sha256和xz(lzma2算法)压缩。
我会做这样的事情(Bash中):
newfilesum="$(wget -q www.example.com/file.txt -O- | tee file.txt | sha256sum)"
oldfilesum="$(xzcat file.txt.xz | sha256sum)"
if [[ $newfilesum != $oldfilesum ]]; then
xz -f file.txt # overwrite with the new compressed data
else
rm file.txt
fi
,并这样做了;
如何下载文件,并检查它与“上次保存”文件?
例如,它第一次下载myfile
,并将其保存为myfile-[date]
,并对其进行压缩。它还添加了一个符号链接,如lastfile
指向myfile-[date]
。下次脚本运行时,它可以检查lastfile
指向的内容是否与新下载的文件相同。
不知道这是否会奏效,但这是我能想到的。
计算文件内容的散列并检查新文件。使用例如md5sum
。您只需保存上一次MD5总和即可检查文件是否更改。
另外,考虑到网络正在不断发展以提供更多关于网页的信息,即元数据。一个有根据的网站应该包括文件版本和/或修改日期(或者一个有效的,过期的标题)作为响应标题的一部分。这一点以及其他一些因素构成了Web 2.0的可扩展性。
我其实并不知道。感谢您的信息 - 非常有用。不幸的是,服务器没有提供任何有用的最后修改或etag标头。 – aidan 2011-06-12 14:59:49
使用'-N'运行'wget'时,是否下载文件的较新副本的决定取决于文件的_local_和_remote_ **时间戳**和**大小**。 因此,如果您知道文件每次更新时都会增长并且不能具有相同的大小,或者如果您认为文件被更新并具有相同大小的可能性太小,则仍可以使用该文件。 – c00kiemon5ter 2011-06-12 15:15:31
@aidan我编辑了我的答案,提供了一个哈希类型的解决方案,检查是否适合您;) – c00kiemon5ter 2011-06-12 16:04:07