文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

自动同步2个目录python脚本

2023-01-31 00:59

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯