Python實(shí)現(xiàn)SVN的目錄周期性備份實(shí)例
本文實(shí)例講述了Python實(shí)現(xiàn)SVN的目錄周期性備份方法。分享給大家供大家參考。具體如下:
起因:今天用SVN時(shí),不小心把遠(yuǎn)程SVN服務(wù)器上的目錄刪掉了,然后在本地又手賤地還原了一下項(xiàng)目(eclipse中右鍵項(xiàng)目team => 還原),導(dǎo)致寫了大半天的代碼全部丟失,用多款數(shù)據(jù)恢復(fù)軟件恢復(fù)也無果。一怒之下寫了這個(gè)目錄周期性備份小工具,每隔5秒備份源目錄中的所有文件到目標(biāo)目錄(保留結(jié)構(gòu)),保證目標(biāo)目錄中的文件只增不減。且每次只拷貝發(fā)生變化的文件(比較兩個(gè)文件的MD5值)。
思考:雖然SVN也是一個(gè)版本管理軟件,但在使用過程總覺得它的諸多操作挺別扭,相比而言Git更強(qiáng)大靈活。我自己理想中的版本控制軟件至少應(yīng)該考慮到一些讓用戶產(chǎn)生較強(qiáng)挫敗的使用場景(也許大部分情況是因?yàn)橛脩粽`用,但如果誤用情況也能考慮到,才能更體現(xiàn)軟件的終極人文關(guān)懷嘛),比如刪除遠(yuǎn)程服務(wù)器上的文件,我覺得應(yīng)該設(shè)計(jì)成這樣:即使用戶刪除了文件,文件還應(yīng)該在一個(gè)緩沖區(qū)中呆1天(或幾個(gè)小時(shí),可以配置),然后由一個(gè)定時(shí)任務(wù)定時(shí)刪除緩沖區(qū)中停留時(shí)間超過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 # 拷貝源目錄到目標(biāo)目錄 def copyDir(srcDir, dstDir): if srcDir in dstDir: # 源目錄包含在目標(biāo)目錄,則直接返回 return if not os.path.isdir(srcDir): print(srcDir, "路徑指定的源目錄不存在!") return; if not os.path.exists(dstDir): # 目標(biāo)目錄不存在時(shí)則創(chuàng)建 os.makedirs(dstDir) for fileOrDirName in os.listdir(srcDir): # 源目錄下的所有文件(包括文件和目錄) TODO BUG:如果srcDir為一個(gè)空目錄? # fileOrDirPath = srcDir + "/" + fileOrDirName fileOrDirPath = os.path.join(srcDir, fileOrDirName) if os.path.isfile(fileOrDirPath): # 如果當(dāng)前是一個(gè)子文件,則直接復(fù)制文件 copyFile(fileOrDirPath, dstDir) if os.path.isdir(fileOrDirPath): # 如果當(dāng)前是一個(gè)子目錄,則遞歸復(fù)制目錄 copyDir(fileOrDirPath, os.path.join(dstDir, fileOrDirName)) # 拷貝源文件到目標(biāo)目錄 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): # 有同名的目標(biāo)文件,則檢查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 # ------------------------------------------------------------- # 定時(shí)備份源目錄到目標(biāo)目錄 # version = 1.0 # author = Will # ------------------------------------------------------------- # 定時(shí)備份源目錄到目標(biāo)目錄,sleepIntervalSeconds為備份時(shí)間間隔秒數(shù) 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程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python Coroutine池化的實(shí)現(xiàn)詳解
在當(dāng)今計(jì)算機(jī)科學(xué)和軟件工程的領(lǐng)域中,池化技術(shù)如線程池、連接池和對象池等已經(jīng)成為優(yōu)化資源利用率和提高軟件性能的重要工具,所以下面我們就來看看Coroutine池化的具體實(shí)現(xiàn)吧2024-01-01對比分析BN和dropout在預(yù)測和訓(xùn)練時(shí)區(qū)別
這篇文章主要為大家介紹了對比分析BN和dropout在預(yù)測和訓(xùn)練時(shí)區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05解決pip install的時(shí)候報(bào)錯(cuò)timed out的問題
今天小編就為大家分享一篇解決pip install的時(shí)候報(bào)錯(cuò)timed out的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06淺談python中np.array的shape( ,)與( ,1)的區(qū)別
今天小編就為大家分享一篇python中np.array的shape ( ,)與( ,1)的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06python詞云庫wordcloud的使用方法與實(shí)例詳解
這篇文章主要介紹了python詞云庫wordcloud的使用方法與實(shí)例詳解,需要的朋友可以參考下2020-02-02python實(shí)現(xiàn)時(shí)間o(1)的最小棧的實(shí)例代碼
這篇文章主要介紹了python實(shí)現(xiàn)時(shí)間o(1)的最小棧的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07