Python实现SVN的目录周期性备份实例
本文实例讲述了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程序设计有所帮助。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Linux 터미널에서 Python 버전을 보려고 할 때 Linux 터미널에서 Python 버전을 볼 때 권한 문제에 대한 솔루션 ... Python을 입력하십시오 ...

Python의 Pandas 라이브러리를 사용할 때는 구조가 다른 두 데이터 프레임 사이에서 전체 열을 복사하는 방법이 일반적인 문제입니다. 두 개의 dats가 있다고 가정 해

파이썬 프로그래밍에서 Python 매개 변수 주석의 대체 사용법, 매개 변수 주석은 개발자가 기능을 더 잘 이해하고 사용하는 데 도움이되는 매우 유용한 기능입니다 ...

Python 크로스 플랫폼 데스크톱 응용 프로그램 개발 라이브러리 선택 많은 Python 개발자가 Windows 및 Linux 시스템 모두에서 실행할 수있는 데스크탑 응용 프로그램을 개발하고자합니다 ...

내 코드가 API에 의해 데이터를 반환 할 수없는 이유는 무엇입니까? 프로그래밍에서 우리는 종종 API가 호출 될 때 NULL 값을 반환하는 문제를 겪는 경우가 종종 있습니다.

Uvicorn은 HTTP 요청을 어떻게 지속적으로 듣습니까? Uvicorn은 ASGI를 기반으로 한 가벼운 웹 서버입니다. 핵심 기능 중 하나는 HTTP 요청을 듣고 진행하는 것입니다 ...

Python 스크립트는 특정 위치에서 Cursor 위치로 출력을 어떻게 제거합니까? Python 스크립트를 작성할 때 이전 출력을 커서 위치로 지우는 것이 일반적입니다 ...

많은 개발자들이 PYPI (PythonPackageIndex)에 의존합니다 ...
