python备份发包脚本_Python备份脚本,python
編寫backup.py腳本,實現以下目標:
需要支持完全和增量備份
周一執行完全備份
其他時間執行增量備份
備份文件需要打包為tar文件并使用gzip格式壓縮
整體框架創建3個函數,分別實現完全備份、增量備份、文件加密3種功能:
1.首先導入time模塊,利用if進行判斷,如果當地時間是星期一,執行完全備份函數,否則執行增量備份函數,其中,通配符%a代表時間星期幾縮寫,上傳參數分別為要備份的原目錄、目標目錄、md5字典存放目錄
2.調用完全備份函數:
a)首先獲取新文件名,將新文件名放入目標目錄下,目的是定義備份文件的絕對路徑,以寫壓縮方式打開目標目錄下新文件,將原目錄寫入新文件中,完成完全備份,其中os.path.join作用是將目錄名和文件的基名拼接成一個完整的路徑
b)了解os.walk()目錄遍歷器輸出文件結構,利用for循環將要備份原目錄中文件遍歷出來作為字典鍵值對鍵, md5加密結果作為字典鍵值對的值(此時將原目錄中文件作為上傳參數調用文件加密函數),存入空字典中,字典中每個文件對應一個md5值,最后將字典寫入到md5字典存放目錄中
3.調用文件加密函數:將原目錄文件循環讀取逐一加密,返回加密結果
4.調用增量備份函數:
a)增量備份函數代碼與完全備份函數基本一致
b)區別在于,備份前要先以二進制讀方式打開md5字典存放目錄,讀取舊數據,判斷舊數據中鍵對應的加密值與新加密值是否相同,如果不相同,則將新增內容寫入到目標文件中(即只備份新數據)
5.注意:md5主要用于原文件與新文件判斷
步驟一:編寫腳本
vim backup.py
#!/usr/bin/env python3
import time
import os
import tarfile
import hashlib
import pickle
#用于判斷兩個文件是否相同,提取每個文件中的前4字節的內容然后輸出md5碼進行比較
def check_md5(fname):
m = hashlib.md5()
with open(fname, 'rb') as fobj:
while True:
data = fobj.read(4096)
if not data:
break
m.update(data)
return m.hexdigest()
def full_backup(src_dir, dst_dir, md5file):
fname = os.path.basename(src_dir.rstrip('/'))
fname = '%s_full_%s.tar.gz' % (fname, time.strftime('%Y%m%d'))
fname = os.path.join(dst_dir, fname)
md5dict = {}
tar = tarfile.open(fname, 'w:gz')
tar.add(src_dir)
tar.close()
for path, folders, files in os.walk(src_dir):
for each_file in files:
key = os.path.join(path, each_file)
md5dict[key] = check_md5(key)
with open(md5file, 'wb') as fobj:
pickle.dump(md5dict, fobj)
def incr_backup(src_dir, dst_dir, md5file):
fname = os.path.basename(src_dir.rstrip('/'))
fname = '%s_incr_%s.tar.gz' % (fname, time.strftime('%Y%m%d'))
fname = os.path.join(dst_dir, fname)
md5dict = {}
with open(md5file, 'rb') as fobj:
oldmd5 = pickle.load(fobj)
for path, folders, files in os.walk(src_dir):
for each_file in files:
key = os.path.join(path, each_file)
md5dict[key] = check_md5(key)
with open(md5file, 'wb') as fobj:
pickle.dump(md5dict, fobj)
tar = tarfile.open(fname, 'w:gz')
for key in md5dict:
if oldmd5.get(key) != md5dict[key]:
tar.add(key)
tar.close()
if __name__ == '__main__':
# mkdir /tmp/demo; cp -r /etc/security /tmp/demo
src_dir = '/tmp/demo/security'
dst_dir = '/var/tmp/backup' # mkdir /var/tmp/backup
md5file = '/var/tmp/backup/md5.data'
if time.strftime('%a') == 'Mon':
full_backup(src_dir, dst_dir, md5file)
else:
incr_backup(src_dir, dst_dir, md5file)
步驟二:測試腳本執行
python3 backup.py
cd /var/tmp/backup/
ls
md5.data security_full_20180502.tar.gz security_incr_20180502.tar.gz
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的python备份发包脚本_Python备份脚本,python的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python selenium 验证码识
- 下一篇: 尹成python爬虫百度云_Python