#!/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任务即可。
时间: 2024-10-12 14:20:28