5

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

不过,这个文件不会经常更改,所以如果下载的文件已经存在,我想丢弃它。

最简单的方法是什么?

谢谢!

4

4 回答 4

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

这样就完成了;

于 2011-06-12T14:39:36.227 回答
1

计算文件内容的哈希值并检查新的。使用例如md5sum. 您只需保存最后一个 MD5 和即可检查文件是否已更改。

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

于 2011-06-12T14:23:35.923 回答
0

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

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

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

于 2011-06-12T14:20:40.910 回答
0

您可以使用sum命令将新文件与上一个文件进行比较。这需要文件的校验和。如果两个文件具有相同的校验和,则它们很可能完全相同。还有另一个名为md5的命令采用 md5指纹,但该sum命令适用于所有系统。

于 2011-06-12T14:26:32.673 回答