自动同步2个目录python脚本

2023-01-31 00:01:53 目录 脚本 同步
#!/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任务即可。

相关文章