![比较动态生成的档案的内容](https://linux22.com/image/944/%E6%AF%94%E8%BE%83%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90%E7%9A%84%E6%A1%A3%E6%A1%88%E7%9A%84%E5%86%85%E5%AE%B9.png)
简短的问题:我有两个动态生成的 tar 存档(因此它们具有不同的时间戳),我如何比较它们,忽略时间上的任何不同?
背景...
我正在做一些备份,其中我使用脚本生成需要备份的内容,将它们放入一个目录中,然后 tar 该目录并保留几个旧版本。备份脚本需要每 30 分钟运行一次,以确保我们不会损失数小时的工作。
现在我意识到,在某些时间段内数据不会改变,因此一遍又一遍地存储相同内容的重复项是没有意义的。我想在保存之前比较一下档案。我的尝试是运行cmp newdata.tar.gz olddata.tar.gz
并仅newdata.tar.gz
在包含新数据时存储。显然这不起作用,因为有不同的时间戳。
答案1
以下是三种方法。第一个是我的偏好。
更改文件生成过程
dump_table foo >foo.dump
如果旧文件与新文件相同,则保留旧文件,而不是不加区别地重新生成文件 ( )。
dump_table foo >foo.dump.new
if cmp foo.dump foo.dump.new; then
rm foo.dump.new
else
mv foo.dump.new foo.dump
fi
将档案挂载为目录
使用AVFS创建整个目录层次结构的视图,其中所有存档都有一个关联的目录(名称相同,#
末尾附加),该目录似乎保存存档内容。
mountavfs
d=$(date -d %Y%m%d%H%M%S); mkdir $d; tar czf /path/to/$d.tgz $d; rmdir $d
cd /path/to/back/up
rsync -ac --compare-dest=~/.avfs/path/to/yesterday.tgz . ~/.avfs/path/to/$d.tgz
使用具有必要功能的备份工具
备份程序需要极其可靠。本土解决方案很难覆盖所有情况。因此,请考虑一个完整的备份程序。我认为表里不一会做你所需要的:它执行增量备份,并且使用 rsync 算法,因此它不应该在已经存在的数据上浪费任何空间。
答案2
一种选择是使用备份工具,例如backup2l
,它可以配置为任何级别的差异备份和任意数量的完整备份。backup2l
以您喜欢的任何频率作为 cronjob 运行,并通过为其 conf 文件设置一些值来配置它。它实际上是 tar 或 afio 的包装器,它保留带有哈希值的文件列表以查找更改,并提供一种简单的方法来获取状态或按日期恢复文件。
第二个选项是使用版本控制系统,例如cvs
、等。设置一个 cronjob 来进行自动提交(可能还有每日标记)。根据 vcs 选择,您可能需要一些脚本来添加新文件或删除旧文件。svn
git
对于每半小时一次的频率,我建议使用 vcs 选项。但是您可以使用(或任何其他备份工具)将两者结合起来backup2l
备份 vcs 存储库(备份冗余总是好的)。
答案3
档案中的文件是否发生变化,或者只是添加了新文件?
如果您只添加文件而不更改任何文件,请尝试如下操作:
tar ztf olddata.tar.gz | sort > tmpfile1
tar ztf newdata.tar.gz | sort > tmpfile2
diff tmpfile{1,2} > /dev/null
if test $? -eq 0
then
echo ignore newdata.tar.gz
else
echo keep olddata.tar.gz
fi
rm tmpfile{1,2}
请注意,缺少v
from tar 目录命令。
如果您只想跳过具有相同内容的存档,请添加 av
到混合中,如下所示:
tar ztvf olddata.tar.gz | sort > tmpfile1
等等。
答案4
那么尝试一下这个:
OLDSUM=`tar zxOf olddata.tar.gz | md5sum | awk '{print $1}'`
NEWSUM=`tar zxOf newdata.tar.gz | md5sum | awk '{print $1}'`
if test "${NEWSUM}" != "${OLDSUM}"
then
echo save newdata.tar.gz
else
echo nothing changed
fi
首都O
将存档内容提取到stdout
.
但是,除非文件以完全相同的顺序添加到存档中(尽管它们可能是这样),否则它将不起作用。