前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自动同步2个目录python脚本

自动同步2个目录python脚本

作者头像
py3study
发布2020-01-15 11:10:44
1.2K0
发布2020-01-15 11:10:44
举报
文章被收录于专栏:python3python3
代码语言:javascript
复制
#!/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任务即可。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档