我有一个 shell 脚本。一个 cron 作业每天运行一次。目前它只是使用 wget 从网上下载一个文件,在文件名上附加一个时间戳,然后压缩它。基本的东西。
不过,这个文件不会经常更改,所以如果下载的文件已经存在,我想丢弃它。
最简单的方法是什么?
谢谢!
我有一个 shell 脚本。一个 cron 作业每天运行一次。目前它只是使用 wget 从网上下载一个文件,在文件名上附加一个时间戳,然后压缩它。基本的东西。
不过,这个文件不会经常更改,所以如果下载的文件已经存在,我想丢弃它。
最简单的方法是什么?
谢谢!
你真的需要压缩文件吗?
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
这样就完成了;
计算文件内容的哈希值并检查新的。使用例如md5sum
. 您只需保存最后一个 MD5 和即可检查文件是否已更改。
此外,考虑到网络正在发展以提供更多关于页面的信息,即元数据。一个有根据的网站应该包含文件版本和/或修改日期(或有效的过期标题)作为响应标题的一部分。这一点,以及其他一些事情,构成了 Web 2.0 的可伸缩性。
如何下载文件,并根据“上次保存”文件检查它?
比如第一次下载myfile
,保存为myfile-[date]
,然后压缩。它还添加了一个符号链接,例如lastfile
指向myfile-[date]
. 下次脚本运行时,它可以检查任何lastfile
指向的内容是否与新下载的文件相同。
不知道这是否会奏效,但这是我能想到的。