专栏首页python3自动同步2个目录python脚本

自动同步2个目录python脚本

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python 给windows机器改名加

    o(︶︿︶)o 唉。。这个代码写出来就用了1个小时,调试用了一天。。真纠结,不过收获了好多经验。

    py3study
  • 操作文件和目录

    当操作文件、目录时,可在命令行下面输入操作系统提供的各种命令来完成,如dir、cp等 其实操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python...

    py3study
  • 利用python批量删除文件

    py3study
  • 怎样维护成功的开源项目

    开源可不仅仅是将代码扔到网上就万事大吉了,将开源项目变成能让自己引以为豪的东西才算成功。那么,你需要注意哪些方面呢? 写好指导性文字 每一个开源项目有三样东西是...

    张善友
  • 【项目实战】自监控-02-os

    系统:Windows 7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3....

    zishendianxia
  • 我不是个优秀的开发人员,我只是擅长搜索谷歌??

    作为Web开发人员需要良好地掌握各项技术:终端的用法、HTML、CSS、JavaScript、云基础架构、部署策略、数据库、HTTP协议等等。有人尝试记录Web...

    闫小林
  • 020.掌握Pod-Pod基础使用

    Pod可以由1个或多个容器组合而成,通常对于紧耦合的两个应用,应该组合成一个整体对外提供服务,则应该将这两个打包为一个pod。

    木二
  • 小特跨境电商ERP桌面版 3.数据库如何设计?才能兼容各平台

    ERP跨境电商ERP,是一个非常庞大的系统。不仅模块很多,而且彼此关系也非常紧密。因此,数据库的设计至关重要,一个好的数据库结构,可以使系统灵活多变,扩展性好。

    用户1219352
  • 机器人正在模拟人类大脑的“思维导图”学会独立思考!

    神经网络是一门重要的机器学习技术。它是目前最为火热的研究方向 -- 深度学习的基础。神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术。人脑中...

    企鹅号小编
  • 使用LXD搭建Web网站

    Linux的容器是Linux的一组进程,通过使用Linux内核功能与系统隔离。它是一个类似于虚拟机的构造,但它的更轻量级。您可以在同一台服务器上轻松创建多个容器...

    独木桥先生

扫码关注云+社区

领取腾讯云代金券