バックアップpythonスクリプト

バックアップ用のPythonスクリプトを作った。

特徴は、、、
・ファイルが更新されていたら上書きする。
・削除されているファイルはバックアップも削除
・confファイルでバックアップ場所指定可



========== backup.py ==========
# -*- coding: utf-8 -*-
conf='backup.conf'
log='backup.log'
COPY_HIDDEN_FOLDERS = False
REMOVE_NOT_EXISTS_FILES = True

import os, shutil
import codecs

def copy(ipath,odir):
    fname = os.path.basename(ipath)
    idir  = os.path.dirname(ipath)
    opath = os.path.join(odir,fname)
    if not os.path.exists(opath):
        if not os.path.isdir(odir):
            os.makedirs(odir)
            shutil.copymode(idir,odir)
        # print fname
        try:
            shutil.copy2(ipath,opath)
        except IOError:
            print( 'IOError occur at ' + ipath )
    else:
        if os.stat(ipath).st_mtime > os.stat(opath).st_mtime + 0.001:
            print ipath + u' => ' + opath
            shutil.copy2(ipath,opath)          

def copytree(idir,odir):
    if os.path.isdir(idir):
        # print idir, odir
        try:
            for sub in os.listdir(idir):
                ipath = os.path.join(idir,sub)
                if os.path.isdir(ipath):
                    if not COPY_HIDDEN_FOLDERS and sub[0] == '.':
                        print 'skip at ' + sub
                        continue
                    opath = os.path.join(odir,sub)
                else:
                    opath = odir
                copytree(ipath,opath)
        except WindowsError:
            print( 'Winodws Error occur at ' + idir )
    elif os.path.isfile(idir):
        copy(idir,odir)

def checktree(odir,idir,remove):
    for sub in os.listdir(odir):
        opath = os.path.join(odir,sub)
        ipath = os.path.join(idir,sub)
        if os.path.isdir(opath):
            if not os.path.exists(ipath):
                print 'not exists ' + ipath
                if remove:
                    shutil.rmtree( opath )
            else:
                checktree(opath,ipath,remove)
        elif os.path.isfile(opath):
            if not os.path.exists(ipath):
                print 'not exists ' + ipath
                if remove:
                    os.remove( opath )
            elif os.stat(opath).st_mtime > os.stat(ipath).st_mtime + 0.001:
                print 'modified ' + opath

for line in codecs.open(conf,'r','utf-8'):
    idir = line.split(u'=>')[0].strip()
    odir = line.split(u'=>')[1].strip()
    copytree(idir,odir)
    checktree(odir,idir,REMOVE_NOT_EXISTS_FILES)

import datetime
fpLog = open( log, 'w' )
fpLog.write( 'execute at' + str( datetime.datetime.today() ) )


========== backup.conf ==========
C:\Users\Public => E:\backup\Public
C:\Users\guest => E:\backup\guest

コメント

このブログの人気の投稿

Python SQLite スレッド間でコネクションの使いまわしは出来ない

slackでgeneralの投稿を全削除する

Google location history(JSON形式)をCSVファイルにする