增量备份
amendment-back-up的Python项目详细描述
用于文件比较和新文件备份的Python类
作者:悉尼大学的孙宇
电子邮件:sunyu0410@gmail.com
网站:https://github.com/sunyu0410/AmendmentBackUp
动机
在备份大量数据时,通常 最好只复制修改过的和新的文件,而不是简单地 覆盖整个目录。AmendmentBackUp(ABU)类 提供了一个简单的接口来执行此操作。不需要依赖项 除了Python 3标准库之外
设计
假设我们有两个文件夹,一个源文件夹dir1,您有 最近的文件和一个引用文件夹dir2,其中包含 你以前的备份。ABU所做的是比较 dir1与dir2中的文件一起,并将文件复制到第三个 目标文件夹dst。
一个简单的例子
fromAmendmentBackUpimport*createDemo()abu=AmendmentBackUp(dir1=r"demo/dir1",dir2=r"demo/dir2",dst=r"demo/dst")abu.compare()abu.backup()
解释
假设您有dir1和dir2(以及dst来复制 文件到),具有以下树结构:
dir1 (source, recently updated) | file1.txt | file2.txt (modified) | file3.txt (new) | +---subfolder1 | file4.txt | +---subfolder2 | file5.txt | file6.txt (modified) | \---subfolder3 (new) anyfile.txt dir2 (reference, e.g. a previous backup) | file1.txt | file2.txt | file7.txt | +---subfolder1 | file4.txt | \---subfolder2 file5.txt file6.txt dst (destination)
在本例中,我们希望在dir1:
中复制修改后的新文件file2.txt file3.txt subfolder2/file6.txt
以及新文件夹:
subfolder3
通过调用
abu=AmendmentBackUp(dir1=r'path_to/dir1',dir2=r'path_to/dir2',dst=r'path_to/dst')
顺便说一下,createDemo()将创建一个演示文件夹 上述结构。启动后,调用以下ABU 处理方法:
- abu.compare():通过遍历所有文件和
文件夹中的文件夹{TT3}$,并检查相应的存在
dir2.
- 中的对应项
- 如果为负数,则会将文件或文件夹添加到复制列表中;
- 如果为正,则比较两个对应的文件(来自^{tt3})$
和dir2,分别使用时间戳进行浅比较
以及文件大小);
- 如果两个文件不匹配,它会将文件添加到副本中 列表;
- 否则,它将继续到下一个。
- abu.backup():复制复制列表中的文件和文件夹。
- 将首先复制文件夹如果父文件夹 复制后,将跳过任何子文件夹;
- 接下来将复制文件。如果文件属于复制的任何文件夹 在上一步中,将跳过它。
- 备份过程的元数据将存储在名为 _abu带有时间戳(年-月-日-时-分-秒) dst文件夹。其中包括
- abu_log.txt Log file - abu_obj.pickle ABU object of this backup task - dir1_tree.txt Tree structure of dir1 (source) - dir2_tree.txt Tree structure of dir2 (reference) - dst_tree.txt Tree structure of dst (destination)
结果
以下是备份后dst的树结构:
dst | file2.txt | file3.txt | +---subfolder2 | file6.txt | +---subfolder3 | anyfile.txt | \---_abu_20190717101307 abu_log.txt abu_obj.pickle dir1_tree.txt dir2_tree.txt dst_tree.txt
如果要将文件添加到上一个backdir2,则可以 只需将dst设置为dir2。
限制
当源文件夹dir1是自然文件夹时,ABU最适合 引用文件夹dir2的增长自然生长的意思是 不应该有太多的重命名或移动子文件夹 从dir2到dir1。否则,使用版本控制系统 可能是更好的选择,因为ABU不会跟踪任何 文件夹或文件。