This article mainly introduces the Python file full backup and differential backup details related information, friends can refer to Python file full backup and differential backup
Previously, the md5 mode was used for differential backup, but the md5 mode has the following problems:
An error occurred while obtaining the MD5 value of some soft connections by using md5sum.
Empty directory backup is not supported because md5sum cannot obtain the md5 value of the empty directory
Permission modification md5sum cannot be judged
Solution:
Use the mtime ctime of the file
Mtime (Modified time) is changed as the file content changes when the file is written.
Ctime (Create time) is changed as Inode content changes when the file is written, the owner, permission, or link settings are changed.
Let's talk a little bit about the code:
#!/usr/bin/env pythonimport time,os,sys,cPicklefileInfo = {}def logger(time,fileName,status,fileNum): f = open('backup.log','a') f.write("%s\t%s\t%s\t\t%s\n" % (time,fileName,status,fileNum))def tar(sDir,dDir,fileNum): command = "tar zcf %s %s >/dev/null 2>&1" % (dDir + ".tar.gz",sDir) if os.system(command) == 0: logger(time.strftime('%F %X'),dDir + ".tar.gz",'success',fileNum) else: logger(time.strftime('%F %X'),dDir + ".tar.gz",'failed',fileNum)def fullBak(path): fileNum = 0 for root,dirs,files in os.walk(path): for name in files: file = os.path.join(root, name) mtime = os.path.getmtime(file) ctime = os.path.getctime(file) fileInfo[file] = (mtime,ctime) fileNum += 1 f = open(P,'w') cPickle.dump(fileInfo,f) f.close() tar(S,D,fileNum)def diffBak(path): for root,dirs,files in os.walk(path): for name in files: file = os.path.join(root,name) mtime = os.path.getmtime(file) ctime = os.path.getctime(file) fileInfo[file] = (mtime,ctime) if os.path.isfile(P) == 0: f = open(P,'w') f.close() if os.stat(P).st_size == 0: f = open(P,'w') cPickle.dump(fileInfo,f) fileNum = len(fileInfo.keys()) f.close() print fileNum tar(S,D,fileNum) else: f = open(P) old_fileInfo = cPickle.load(f) f.close() difference = dict(set(fileInfo.items())^set(old_fileInfo.items())) fileNum = len(difference) print fileNum difference_file = ' '.join(difference.keys()) print difference_file tar(difference_file,D,fileNum) f = open(P,'w') cPickle.dump(fileInfo,f) f.close()def Usage(): print ''' Syntax: python file_bakcup.py pickle_file model source_dir filename_bk model: 1:Full backup 2:Differential backup example: python file_backup.py fileinfo.pk 2 /etc etc_$(date +%F) explain: Automatically add '.tar.gz' suffix ''' sys.exit()if len(sys.argv) != 5: Usage()P = sys.argv[1]M = int(sys.argv[2])S = sys.argv[3]D = sys.argv[4]if M == 1: fullBak(S)elif M == 2: diffBak(S)else: print "\033[;31mDoes not support this mode\033[0m" Usage()
Test:
$ Python file_backup.py data. pk 1 data _ $ (date + % F) # full backup $> data/www.linuxeye.com # test file creation and modify file permissions $ chmod 777 data/py/eshop_bk/data. db $ python file_backup.py data. pk 2 data _ $ (date + % F) _ 1 # back up the changed File 2 data/py/eshop_bk/data. db data/www.linuxeye.com
For more details about full backup and differential backup of Python files, please refer to PHP!