2011-06-12 38 views
5

我有一个shell脚本。一个cron作业每天运行一次。目前它只是使用wget从网上下载一个文件,附加一个时间戳到文件名,然后压缩它。基本的东西。bash scripting de-dupe

虽然这个文件并不经常改变,所以我想放弃下载的文件,如果它已经存在。

最简单的方法来做到这一点?

谢谢!

回答

5

你真的需要压缩文件吗?
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 

,并这样做了;

+0

我其实并不知道。感谢您的信息 - 非常有用。不幸的是,服务器没有提供任何有用的最后修改或etag标头。 – aidan 2011-06-12 14:59:49

+0

使用'-N'运行'wget'时,是否下载文件的较新副本的决定取决于文件的_local_和_remote_ **时间戳**和**大小**。 因此,如果您知道文件每次更新时都会增长并且不能具有相同的大小,或者如果您认为文件被更新并具有相同大小的可能性太小,则仍可以使用该文件。 – c00kiemon5ter 2011-06-12 15:15:31

+0

@aidan我编辑了我的答案,提供了一个哈希类型的解决方案,检查是否适合您;) – c00kiemon5ter 2011-06-12 16:04:07

0

如何下载文件,并检查它与“上次保存”文件?

例如,它第一次下载myfile,并将其保存为myfile-[date],并对其进行压缩。它还添加了一个符号链接,如lastfile指向myfile-[date]。下次脚本运行时,它可以检查lastfile指向的内容是否与新下载的文件相同。

不知道这是否会奏效,但这是我能想到的。

+0

我喜欢这个想法。我希望有一种方法可以在不必存储指向最后一个文件的指针的情况下进行重复。但这会起作用。 – aidan 2011-06-12 15:01:51

+0

拧紧它。我会用perl。 'perl -e'%x =(); (<*>){$ md5 = \'md5sum $ _ \';除非$ md5 =〜/([0-9a-f] {32})/; \ rm $ _ \'if $ x {$ 1} ++}' – aidan 2011-06-12 15:06:31

1

计算文件内容的散列并检查新文件。使用例如md5sum。您只需保存上一次MD5总和即可检查文件是否更改。

另外,考虑到网络正在不断发展以提供更多关于网页的信息,即元数据。一个有根据的网站应该包括文件版本和/或修改日期(或者一个有效的,过期的标题)作为响应标题的一部分。这一点以及其他一些因素构成了Web 2.0的可扩展性。

0

您可以使用sum命令比较新文件和最后一个文件。这需要文件的校验和。如果两个文件具有相同的校验和,则它们非常非常可能完全相同。还有另一个命令叫做md5,它指纹md5 指纹,但sum命令在所有系统上。

相关问题