需求:
在/root/backup下面有兩個資料夾dst和src。要求在周一的時候進行完全備份,其餘日子進行增量備份。從src備份到dst。
思路及關鍵點:
建立乙個檔案,以字典方式記錄src的檔名以及檔案對應的md5的值
完全備份的時候將檔名和md5值寫在乙個檔案裡面。cpickle的知識點。
增量備份的時候比較檔名是否在key裡面,沒有就要備份;有的話,這個檔案的md5值是否改變,改變了就要備份
os.path.join()拼接路徑,os.listdir(),os.chdir()
time.strftime()判斷週幾
cpickle,可以無損記錄所有python的變數型別。檔案操作。
tarfile對檔案打包的使用
hashlib用於計算檔案md5的值。注意不要一次開啟乙個檔案,4k地開啟,防止開啟乙個超大檔案爆記憶體。
with file()可以開啟乙個檔案之後不f.close()
#!/usr/bin/env python
import time
import os
import cpickle as p
import tarfile
import hashlib
basedir = '/root/backup'
srcdir = 'src'
dstdir = 'dst'
fullname = "full_%s_%s.tar.gz" % (srcdir, time.strftime('%y%m%d'))
incrname = "incr_%s_%s.tar.gz" % (srcdir, time.strftime('%y%m%d'))
md5file = 'md5.data'
defmd5sum
(fname):
m = hashlib.md5()
with file(fname) as f:
while
true:
data = f.read(4096)
if len(data) == 0:
break
m.update(data)
return m.hexdigest()
deffullbackup
(): md5dict = {}
filelist = os.listdir(os.path.join(basedir,srcdir))
for eachfile in filelist:
md5dict[eachfile] = md5sum(os.path.join(basedir,srcdir,eachfile))
with file(os.path.join(basedir,dstdir,md5file),'w') as f:
p.dump(md5dict,f)
tar = tarfile.open(os.path.join(basedir,dstdir,fullname),'w:gz')
os.chdir(basedir)
tar.add(srcdir)
tar.close()
defincrbackup
(): newmd5 = {}
filelist = os.listdir(os.path.join(basedir,srcdir))
for eachfile in filelist:
newmd5[eachfile] = md5sum(os.path.join(basedir,srcdir,eachfile))
with file(os.path.join(basedir,dstdir,md5file)) as f:
storedmd5 = p.load(f)
tar = tarfile.open(os.path.join(basedir,dstdir,incrname),'w:gz')
os.chdir(basedir)
for eachkey in newmd5:
if (eachkey not
in storedmd5) or (newmd5[eachkey] != storedmd5[eachkey]):
tar.add(os.path.join(srcdir,eachkey))
tar.close()
with file(os.path.join(basedir,dstdir,md5file),'w') as f:
p.dump(newmd5,f)
defmain
():if time.strftime('%a') == 'mon':
fullbackup()
else:
incrbackup()
if __name__ == '__main__':
main()
~
用Python寫指令碼,實現完全備份和增量備份的示例
需求 在 root backup下面有兩個資料夾dst和src。要求在周一的時候進行完全備份,其餘日子進行增量備份。從src備份到dst。思路程式設計客棧及關鍵點 建立乙個檔案,以字典方式記錄src的檔名以及檔案對應的md5的值 完全備份的時候將檔名和md5值寫在乙個檔案裡面。cpickle的知識點...
用python寫指令碼跑程式 2020 10 15
公司最近接了乙個新專案,支氣管導航。為了驗證軟體的功能,就需要跑很多例項,這時候就會用到指令碼跑資料,就不需要一遍遍手動執行軟體。先上 import os import sys import subprocess extractionexe airwaycenterlineextractioneng...
mysql完全備份,增量備份及恢復指令碼
剛進入公司時,領導分配的實驗任務,這是我寫的第乙個比較完整和滿意的mysql全備,増備及恢復指令碼,歡迎指點!如下!bin bash full increment backup and recover 說明 事先要確保存在 data bak目錄,且要保證在執行增量備份時已做過至少一次全量備份,否則找...