#!/usr/bin/python # -*- coding: utf8 -*- import os import sys import filecmp import re import shutil file_list = [] def recursive_dir(dir1): """ 遞歸當前目錄的文件和子目錄 :param dir1: 傳參 需要遞歸的目錄 :return: 當前目錄下所有文件和目錄 """ curDir = os.path.abspath(dir1) file_list.append(curDir) l = os.listdir(curDir) for item in l: realitem = os.path.join(curDir, item) if os.path.isfile(realitem): file_list.append(realitem) if os.path.isdir(realitem): recursive_dir(realitem) return file_list update_file_list = [] def comparame(dir1, dir2): """ 遞歸比較2個目錄的文件和目錄 :param dir1: 源目錄 :param dir2: 備份目錄 :return: 需要進行同步的文件和目錄 """ dircomp = filecmp.dircmp(dir1, dir2) # 源目錄僅有的文件和目錄 only_in_dir1 = dircomp.left_only for item in only_in_dir1: item = os.path.join(dir1, item) if os.path.isfile(item): # 如果是源目錄僅有的文件,則直接添加到更新列表 update_file_list.append(item) if os.path.isdir(item): # 如果是源目錄僅有的目錄,則進行遍歷,添加到更新列表 update_file_list.extend(recursive_dir(item)) # 如果不對全局的接收列表清空,將會產生重複的條目 del file_list[:] # 文件名相同但其它屬性或者內容不同的文件,這種也直接添加到更新列表 diff_in_dir1 = dircomp.diff_files [update_file_list.append(os.path.join(dir1, x)) for x in diff_in_dir1] # 或者這樣寫 #for item in diff_in_dir1: # update_file_list.append(os.path.join(dir1, item)) # 如果存在相同子目錄,則遞歸遍歷 if len(dircomp.common_dirs) > 0: for item in dircomp.common_dirs: comparame(os.path.join(dir1, item), os.path.join(dir2, item)) # 返回總的需要同步的列表清單 return update_file_list def main(): dir1 = os.path.abspath(sys.argv[1]) dir2 = os.path.abspath(sys.argv[2]) #dir1 = os.path.abspath('../0111') #dir2 = os.path.abspath('../0110') #print "源目錄是:", dir1 #print "備份目錄:", dir2 # 更新文件列表 source_files = comparame(dir1, dir2) for item in source_files: # 將源目錄路徑替換成備份目錄路徑 dest_item = re.sub(dir1, dir2, item) # 如果需要同步的是目錄,則創建 if os.path.isdir(item): os.makedirs(dest_item) # 如果需要同步的是文件,則複製 if os.path.isfile(item): shutil.copyfile(item, dest_item) main()
最後將此腳本放進crontab任務即可。