Python实现SVN的目录周期性备份实例

作者:优雅先生 时间:2021-07-19 16:13:22 

本文实例讲述了Python实现SVN的目录周期性备份方法。分享给大家供大家参考。具体如下:

起因:今天用SVN时,不小心把远程SVN服务器上的目录删掉了,然后在本地又手贱地还原了一下项目(eclipse中右键项目team => 还原),导致写了大半天的代码全部丢失,用多款数据恢复软件恢复也无果。一怒之下写了这个目录周期性备份小工具,每隔5秒备份源目录中的所有文件到目标目录(保留结构),保证目标目录中的文件只增不减。且每次只拷贝发生变化的文件(比较两个文件的MD5值)。

思考:虽然SVN也是一个版本管理软件,但在使用过程总觉得它的诸多操作挺别扭,相比而言Git更强大灵活。我自己理想中的版本控制软件至少应该考虑到一些让用户产生较强挫败的使用场景(也许大部分情况是因为用户误用,但如果误用情况也能考虑到,才能更体现软件的终极人文关怀嘛),比如删除远程服务器上的文件,我觉得应该设计成这样:即使用户删除了文件,文件还应该在一个缓冲区中呆1天(或几个小时,可以配置),然后由一个定时任务定时删除缓冲区中停留时间超过1天的文件。而不是立即物理删除。

TODO:
增加配置文件,做成命令行程序

md5_caculate.py:


# -*- coding: utf-8 -*-
#!/usr/bin/python
from hashlib import md5
import os
def calMD5(str):
 m = md5()
 m.update(str)
 return m.hexdigest()
def calMD5ForFile(file):
 statinfo = os.stat(file)
 if int(statinfo.st_size) / (1024*1024) >= 1000:
#     print("File size > 1000, move to big file...")
   return calMD5ForBigFile(file)
 m = md5()
 f = open(file, 'rb')
 m.update(f.read())
 f.close()
 return m.hexdigest()
def calMD5ForFolder(dir, MD5File):
 outfile = open(MD5File,'w')
 for root, subdirs, files in os.walk(dir):
   for file in files:
     filefullpath = os.path.join(root, file)
     """print filefullpath"""
     filerelpath = os.path.relpath(filefullpath, dir)
     md5 = calMD5ForFile(filefullpath)
     outfile.write(filerelpath+' '+md5+"\n")
 outfile.close()
def calMD5ForBigFile(file):
 m = md5()
 f = open(file, 'rb')
 buffer = 8192  # why is 8192 | 8192 is fast than 2048
 while 1:
   chunk = f.read(buffer)
   if not chunk : break
   m.update(chunk)
 f.close()
 return m.hexdigest()
if __name__=="__main__":
 print(calMD5ForFile("e:/test/target/a/b/rabbit.txt"))

file_util.py:


# -*- coding: utf-8 -*-
#!/usr/bin/python
import os,shutil
from md5_caculate import calMD5ForFile
# 拷贝源目录到目标目录
def copyDir(srcDir, dstDir):
 if srcDir in dstDir: # 源目录包含在目标目录,则直接返回
   return
 if not os.path.isdir(srcDir):
   print(srcDir, "路径指定的源目录不存在!")
   return;
 if not os.path.exists(dstDir): # 目标目录不存在时则创建
   os.makedirs(dstDir)
 for fileOrDirName in os.listdir(srcDir): # 源目录下的所有文件(包括文件和目录) TODO BUG:如果srcDir为一个空目录?
#     fileOrDirPath = srcDir + "/" + fileOrDirName
   fileOrDirPath = os.path.join(srcDir, fileOrDirName)
   if os.path.isfile(fileOrDirPath): # 如果当前是一个子文件,则直接复制文件
     copyFile(fileOrDirPath, dstDir)
   if os.path.isdir(fileOrDirPath): # 如果当前是一个子目录,则递归复制目录
     copyDir(fileOrDirPath, os.path.join(dstDir, fileOrDirName))
# 拷贝源文件到目标目录
def copyFile(srcFile, dstDir):
 if not os.path.isfile(srcFile):
   print(srcFile, "路径指定的源文件不存在!")
   return
 fileName = os.path.basename(srcFile)
 dstFile = os.path.join(dstDir, fileName)
 if os.path.isfile(dstFile): # 有同名的目标文件,则检查MD5值是否相同,如果不同才Copy
   if calMD5ForFile(srcFile) != calMD5ForFile(dstFile):
     try:
       shutil.copy(srcFile, dstDir)
     except PermissionError:
       print("PermissionError occurs: ", srcFile)
 else:
   shutil.copy(srcFile, dstDir)
if __name__=="__main__":
 copyDir("e:/test/src", "e:/test/target")

backuper.py:


# -*- coding: utf-8 -*-
#!/usr/bin/python
import os, time
from file_util import copyDir
# -------------------------------------------------------------
# 定时备份源目录到目标目录
# version = 1.0
# author = Will
# -------------------------------------------------------------
# 定时备份源目录到目标目录,sleepIntervalSeconds为备份时间间隔秒数
def backupDir(srcDir, dstDir, sleepIntervalSeconds):
 if not os.path.isdir(srcDir):
   print("请指定要备份源目录并确保目录存在!")
   return;
 while True:
   print("备份:", srcDir, ",到:", dstDir)
   copyDir(srcDir, dstDir)
   print("开始休眠", sleepIntervalSeconds, "秒...")
   time.sleep(sleepIntervalSeconds)
if __name__=="__main__":
 backupDir("d:/Documents/workspace/workspace/griddle", "e:/backup/griddle", 20)

希望本文所述对大家的Python程序设计有所帮助。

标签:Python,SVN,备份
0
投稿

猜你喜欢

  • python自动统计zabbix系统监控覆盖率的示例代码

    2023-11-14 08:23:03
  • Oracle数据库由dataguard备库引起的log file sync等待问题

    2023-07-17 07:35:25
  • python调用文件时找不到相对路径的解决方案

    2021-08-21 14:38:24
  • 关于WARNING:Ignoring invalid distribution -pencv-python....警告信息的处理方法(已解决!)

    2021-01-14 18:14:28
  • python连接PostgreSQL数据库的过程详解

    2023-08-24 03:42:31
  • Python程序控制语句用法实例分析

    2021-04-13 06:59:48
  • Python3读取zip文件信息的方法

    2022-08-15 01:54:20
  • 交互设计模式——分页

    2009-07-30 13:00:00
  • Python从使用线程到使用async/await的深入讲解

    2021-07-26 10:56:11
  • Update 语句

    2009-06-22 12:52:00
  • python修改文件内容的3种方法详解

    2021-07-27 10:19:36
  • LINUX下Oracle数据导入导出的方法详解

    2023-07-06 15:20:32
  • python读取图片任意范围区域

    2023-07-16 06:26:21
  • 浅谈php自定义错误日志

    2023-11-14 10:59:40
  • 基于Python开发chrome插件的方法分析

    2023-04-22 14:41:33
  • python读取word文档的方法

    2023-11-24 08:56:28
  • Pandas的read_csv函数参数分析详解

    2021-06-02 13:40:15
  • PyQt5每天必学之布局管理

    2022-11-19 08:14:00
  • Python实现pdf文档转txt的方法示例

    2021-12-08 19:16:16
  • Python调用shell命令常用方法(4种)

    2021-05-06 08:22:06
  • asp之家 网络编程 m.aspxhome.com