自动同步2个目录python脚本

发布时间:2019-06-27 09:49:56编辑:auto阅读(1611)

    #!/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任务即可。

关键字