比较动态生成的档案的内容

比较动态生成的档案的内容

简短的问题:我有两个动态生成的 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 选择,您可能需要一些脚本来添加新文件或删除旧文件。svngit

对于每半小时一次的频率,我建议使用 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}

请注意,缺少vfrom 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.

但是,除非文件以完全相同的顺序添加到存档中(尽管它们可能是这样),否则它将不起作用。

相关内容