因爲備份的須要,須要常常備份一些重要的文件,可是又不能逐個比較,因此就度了一下,找到了這篇博文,在此表示感謝,下面是python3版的寫法,其中有一些改變,重要的改變之處做出了簡要註釋,完整註釋請參考原文,python
重要:下面代碼未經充分測試,在備份本身文件以前,請充分測試,若有疏漏之處,歡迎留言,一塊兒學習web
注意:注意路徑的分割斜槓,在這裏是斜槓/而非反斜槓\
函數
md5校驗選擇備份學習
1 # -*- coding: utf-8 -*- 2 3 4 import hashlib 5 import os 6 import shutil 7 8 9 def md5check(fname): 10 m = hashlib.md5() 11 with open(fname, 'rb') as f: # 這裏文件的打開方式與原文不一樣,因爲在備份個人文件時出現了編碼問題,因此進行了修改,以二進制方式打開 12 while True: 13 data = f.read(4096) 14 if not data: 15 break 16 m.update(data) 17 return m.hexdigest() 18 19 20 21 22 # 文件複製函數 23 def copy(path): 24 new_path = path 25 new_path = new_path.replace(old_source, new_source) 26 print(new_path) 27 if os.path.isfile(new_path): 28 old_md5 = md5check(path) 29 new_md5 = md5check(new_path) 30 if old_md5 != new_md5: 31 shutil.copy(path, new_path) 32 else: 33 dirname = os.path.dirname(new_path) 34 if os.path.exists(dirname): # 若是目錄存在,直接複製文件到new_path 35 shutil.copy(path, new_path) 36 else: # 若是目錄不存在,則直接建立目錄並複製文件 37 try: 38 os.makedirs(dirname) 39 shutil.copy(path, new_path) 40 except WindowsError: 41 print('建立目錄出錯') 42 43 # 查找全部目錄文件的遞歸函數 44 def lsdir(folders): 45 path = os.listdir(folders) 46 for line in path: 47 line = folders + '/' + line 48 if(os.path.isdir(line)): 49 lsdir(line) 50 else: 51 copy(line) 52 53 54 55 56 57 58 59 if __name__ == '__main__': 60 global old_source 61 global new_source 62 print('例子:d:/directory,請輸入要備份的目錄所在地址、以及目標地址:') 63 old_source = 'C:/Users/xxxx/AppData/Local/Google/Chrome/User Data/Default/Local Storage/leveldb' 64 new_source = 'D:/leveldb' # 此處不知道只傳入盤符會發生什麼,建議不要這麼作,未經測試 65 lsdir(old_source) 66
徹底備份測試
# -*- coding: utf-8 -*- # 腳本功能:刪除new_path目錄,而後複製original_path到new_path目錄,注意兩目錄的名稱要同樣,初衷:用於名稱變化的須要備份的文件 # 基於python3 import os import shutil # 不校驗直接刪除已備份文件,再從新備份源文件 def non_checkout_backup(original_path, new_path): if os.path.exists(new_path): shutil.rmtree(new_path) # shutil.rmtree空目錄、有內容的目錄均可以刪,可是必需要存在,不然報錯, 而os.rmdir只能刪除空目錄 shutil.copytree(original_path, new_path) # original_path、new_path都只能是目錄 if __name__ == '__main__': original_path = 'C:/Users/xxxx/AppData/Local/Google/Chrome/User Data/Default/Local Storage/leveldb' new_path = 'D:/leveldb' non_checkout_backup(original_path, new_path)