一、7z命令介绍与安装
使用7z命令可以创建压缩文件。Ubuntu下安装7z命令的命令行命令如下:
1 | sudo apt-get install p7zip-full |
二、3种备份数据方式
存在3种备份数据的方式:完全备份(full backup),差异备份(differential backup)和增量备份(incremental backup)。3种备份数据的方式比较如表1所示。
表1
方式 | 描述 | 优点 | 缺点 |
---|---|---|---|
完全备份 | 备份全部数据 | 无 | 耗时 |
差异备份 | 备份当前数据与上一次完全备份数据之间的差异 | 还原数据只需要上一次完全备份数据和最新一次差异备份数据 | 相对于增量备份,差异备份耗时长 |
增量备份 | 备份当前数据与上一次备份(可以是完全备份,差异备份,增量备份)数据之间的差异 | 相对于差异备份,增量备份耗时短 | 还原数据需要上一次的完全备份数据以及在之后的所有增量备份数据 |
三、Ubuntu下使用7z命令差异备份数据
根据7z命令使用文档,可知使用7z命令可以创建压缩文件和差异压缩文件,借助于上述功能,我们可使用7z命令差异备份数据,此时,“压缩”不是目的,“备份”才是目的。
假定现在需要备份“/home/dsl/Desktop/a”目录下的数据。
3.1、完全备份数据
3.1.1、命令
1 | 7z a /home/dsl/Desktop/b.7z /home/dsl/Desktop/a |
以上命令表示完全备份“/home/dsl/Desktop/a”目录下的数据,最终的完全备份数据文件路径为“/home/dsl/Desktop/b.7z”。
3.1.2、解释
3.1.2.1、“a”选项
表示创建一个压缩文件。
3.2、差异备份数据
3.2.1、命令
1 | 7z u /home/dsl/Desktop/b.7z /home/dsl/Desktop/a -u- -up0q3r2x1y2z0w2\!/home/dsl/Desktop/update.7z |
以上命令表示差异备份“/home/dsl/Desktop/a”目录下的数据,所基于的完全备份数据文件路径为“/home/dsl/Desktop/b.7z”,最终的差异备份数据文件路径为“/home/dsl/Desktop/update.7z”。
3.2.2、解释
3.2.2.1、“u”选项
表示创建保存差异化数据的压缩文件。
3.2.2.2、“-u-”选项
表示不改变“/home/dsl/Desktop/b.7z”压缩文件的内容。
3.2.2.3、“-up0q3r2x1y2z0w2”选项
“-u”选项后面跟随用于创建保存差异化数据的压缩文件的策略。“pqrxyzw”选项字符的含义见表2,“0123”值字符的含义见表3。
表2
选项字符 | 描述 |
---|---|
p | 命中文件路径:在“/home/dsl/Desktop/b.7z”下有相应文件,但是相应文件路径不匹配“/home/dsl/Desktop/a/*.sh”(为便于描述,以“/home/dsl/Desktop/a/*.sh”替换命令中的“/home/dsl/Desktop/a”) |
q | 命中文件路径:在“/home/dsl/Desktop/b.7z”下有相应文件,在“/home/dsl/Desktop/a”下没有相应文件 |
r | 命中文件路径:在“/home/dsl/Desktop/b.7z”下没有相应文件,在“/home/dsl/Desktop/a”下有相应文件 |
x | 命中文件路径:在“/home/dsl/Desktop/b.7z”和“/home/dsl/Desktop/a”下都有相应文件,“/home/dsl/Desktop/b.7z”下相应文件与“/home/dsl/Desktop/a”下相应文件mtime时间戳不一致,前者较新 |
y | 命中文件路径:在“/home/dsl/Desktop/b.7z”和“/home/dsl/Desktop/a”下都有相应文件,“/home/dsl/Desktop/b.7z”下相应文件与“/home/dsl/Desktop/a”下相应文件mtime时间戳不一致,前者较旧 |
z | 命中文件路径:在“/home/dsl/Desktop/b.7z”和“/home/dsl/Desktop/a”下都有相应文件,“/home/dsl/Desktop/b.7z”下相应文件与“/home/dsl/Desktop/a”下相应文件完全一致 |
w | 命中文件路径:在“/home/dsl/Desktop/b.7z”和“/home/dsl/Desktop/a”下都有相应文件,“/home/dsl/Desktop/b.7z”下相应文件与“/home/dsl/Desktop/a”下相应文件mtime时间戳一致,两者文件大小不一致 |
表3
值字符 | 描述 |
---|---|
0 | 忽略相应文件路径,在还原数据时,效果等价于“1”值字符 |
1 | 复制“/home/dsl/Desktop/b.7z”下相应文件路径对应的文件到差异备份数据文件 |
2 | 复制“/home/dsl/Desktop/a”下相应文件路径对应的文件到差异备份数据文件 |
3 | 在差异备份数据文件中标记相应文件路径对应的文件为删除态,在还原数据时,上述文件最终会被删除。该“值字符”只被“7z”压缩文件格式支持 |
3.2.2.4、“\!”选项
表示后面跟随差异备份数据文件路径,“\”字符表示转义控制字符,“\!”字符串表示转义得到“!”字符。
3.3、还原数据
3.3.1、命令
1 | 7z x /home/dsl/Desktop/b.7z |
先还原完全备份数据,再还原差异备份数据,最终得到最新的完整数据。
四、实验
4.1、实验1
“/home/dsl/Desktop/a”目录下文件结构如图1所示。
图1
其中,“d”,“e”和“g”这3个文件的内容分别如下所示。
1 | old d |
1 | old e |
1 | old g |
执行以下命令指定“d”,“e”和“g”这3个文件的mtime时间戳。
1 | touch d --date='2004-02-29 16:21:42' |
接着执行7z a /home/dsl/Desktop/b.7z /home/dsl/Desktop/a
命令,得到完全备份数据文件“/home/dsl/Desktop/b.7z”。
然后修改“/home/dsl/Desktop/a”目录下数据,修改后文件结构如图2所示。
图2
其中,“d”,“e”和“g”这3个文件的内容修改后分别如下所示。
1 | new d |
1 | new e |
1 | new g not equal size |
执行以下命令指定“d”,“e”和“g”这3个文件的mtime时间戳。
1 | touch d --date='2004-01-29 16:21:42' |
执行7z u /home/dsl/Desktop/b.7z /home/dsl/Desktop/a -u- -up0q3r2x1y2z0w2\!/home/dsl/Desktop/update.7z
命令,得到差异备份数据文件“/home/dsl/Desktop/update.7z”。
复制“b.7z”和“update.7z”两个文件到“/home/dsl/tmp2”目录下,执行以下命令还原数据。
1 | 7z x b.7z |
还原得到a目录,其中文件结构如图3所示。
图3
其中,“d”,“e”和“g”这3个文件的内容分别如下所示。
1 | old d |
1 | new e |
1 | new g not equal size |
4.2、实验2
“/home/dsl/Desktop/a”目录下文件结构如图4所示。
图4
其中,“d”,“e”和“g”这3个文件的内容分别如下所示。
1 | old d |
1 | old e |
1 | old g |
执行以下命令指定“d”,“e”和“g”这3个文件的mtime时间戳。
1 | touch d --date='2004-02-29 16:21:42' |
接着执行7z a /home/dsl/Desktop/b.7z /home/dsl/Desktop/a
命令,得到完全备份数据文件“/home/dsl/Desktop/b.7z”。
然后修改“/home/dsl/Desktop/a”目录下数据,修改后文件结构如图5所示。
图5
其中,“d”,“e”和“g”这3个文件的内容修改后分别如下所示。
1 | new d |
1 | new e |
1 | new g not equal size |
执行以下命令指定“d”,“e”和“g”这3个文件的mtime时间戳。
1 | touch d --date='2004-01-29 16:21:42' |
执行7z u /home/dsl/Desktop/b.7z /home/dsl/Desktop/a -u- -up0q1r0x2y1z0w1\!/home/dsl/Desktop/update.7z
命令,得到差异备份数据文件“/home/dsl/Desktop/update.7z”。
复制“b.7z”和“update.7z”两个文件到“/home/dsl/tmp2”目录下,执行以下命令还原数据。
1 | 7z x b.7z |
还原得到a目录,其中文件结构如图6所示。
图6
其中,“d”,“e”和“g”这3个文件的内容分别如下所示。
1 | new d |
1 | old e |
1 | old g |
4.3、实验3
“/home/dsl/Desktop/a”目录下文件结构如图7所示。
图7
接着执行7z a /home/dsl/Desktop/b.7z /home/dsl/Desktop/a
命令,得到完全备份数据文件“/home/dsl/Desktop/b.7z”。
执行7z u /home/dsl/Desktop/b.7z /home/dsl/Desktop/a/* -u- -up3q0r0x0y0z0w0\!/home/dsl/Desktop/update.7z
命令,得到差异备份数据文件“/home/dsl/Desktop/update.7z”。
复制“b.7z”和“update.7z”两个文件到“/home/dsl/tmp2”目录下,执行以下命令还原数据。
1 | 7z x b.7z |
还原无法得到a目录,这是由于a目录路径不匹配“/home/dsl/Desktop/a/*”,而现在有配置“p3”,因此最后a目录被删除。
五、其他
5.1、保存软符号链接指向文件内容
如果在备份时,需要保存软符号链接指向文件内容,而不是软符号链接文件自身,那么可以使用“-l”选项。具体是将以上的:
1 | 7z a /home/dsl/Desktop/b.7z /home/dsl/Desktop/a |
替换为:
1 | 7z a -l /home/dsl/Desktop/b.7z /home/dsl/Desktop/a |
需要特别注意的是:启用“-l”选项之后,有可能由于“指向文件不合理的软符号链接”的存在,而在备份时出现死循环。
参考文献: [1]http://infosec.blog.51cto.com/226250/66478 [2]http://a32.me/2010/08/7zip-differential-backup-linux-windows/ [3]man 7z [4]/usr/share/doc/p7zip-full/DOCS/MANUAL/index.htm