Python实现源目录与备份目录差异对比及自动同步备份

江岸
江岸
发布时间:2026-10-11 | 2人浏览过
原创

本文介绍如何使用Python脚本定期检查源目录与备份目录的差异,并自动同步新增或修改的文件。通过filecmp模块对比文件列表,递归处理子目录,利用os和shutil模块创建缺失的备份路径并复制文件,实现高效的目录备份功能。

Python实现源目录与备份目录差异对比及自动同步备份

在数据管理和系统维护中,定期将源目录的文件同步到备份目录是一项常见需求。通过编写Python脚本,我们可以自动化这一过程,确保备份目录始终包含源目录的最新文件。本文将详细介绍如何使用Python实现这一功能。

核心功能概述

  • 定期检查源目录与备份目录的差异
  • 获取源目录和备份目录进行差异比较
  • 保存源目录特有文件或与备份目录不同的文件
  • 递归判断目录并保存差异文件
  • 将差异文件路径替换为对应的备份路径
  • 判断备份路径不存在时创建目录
  • 对比源目录与新备份目录中的差异文件
  • 将源路径替换为备份目录路径
  • 遍历复制源目录文件到备份目录
  • 设定定时检查以自动同步源目录和备份目录

实现步骤详解

实现这一功能主要分为以下几个步骤:

  1. 获取源目录和备份目录进行差异比较:使用Python的filecmp模块,特别是dircmp类,来比较两个目录的内容。
  2. 保存源目录特有文件或与备份目录不同的文件:从dircmp对象中提取left_only(仅在源目录中存在的文件)和diff_files(在两个目录中存在但内容不同的文件)。
  3. 递归判断目录并保存差异文件:对于两个目录共有的子目录,递归调用比较函数,确保所有层级的差异都被捕获。
  4. 将差异文件路径替换为对应的备份路径:将源目录中的文件路径转换为备份目录中对应的路径。
  5. 判断备份路径不存在时创建目录:如果备份目录中对应的子目录不存在,则创建该目录。
  6. 对比源目录与新备份目录中的差异文件:在创建新目录后,再次比较源目录和新备份目录,确保所有差异文件都被正确识别。
  7. 将源路径替换为备份目录路径:再次更新文件路径,确保所有操作都在正确的备份路径下进行。
  8. 遍历复制源目录文件到备份目录:使用shutil.copyfile函数,将源目录中的文件复制到备份目录中。
  9. 设定定时检查以自动同步源目录和备份目录:可以通过Python的schedule库或操作系统的定时任务(如Linux的cron)来定期执行上述脚本,实现自动同步。

代码实现

以下是实现上述功能的Python代码示例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys
import filecmp
import re
import shutil
holderlist = []
##对应第一个步骤
def compare_me(dir1, dir2):
  dircomp = filecmp.dircmp(dir1, dir2)
  only_in_one = dircomp.left_only
  diff_in_one = dircomp.diff_files
  dirpath = os.path.abspath(dir1)
  [ holderlist.append(os.path.abspath(os.path.join(dir1, x))) for x in only_in_one ]
  [ holderlist.append(os.path.abspath(os.path.join(dir1, x))) for x in diff_in_one ]
  if len(dircomp.common_dirs) > 0:
    for item in dircomp.common_dirs:
      compare_me(os.path.abspath(os.path.join(dir1, item)), os.path.abspath(os.path.join(dir2, item)))
  return holderlist
##对应第二个步骤
def main():
  if len(sys.argv) > 2:
    dir1 = sys.argv[1]
    dir2 = sys.argv[2]
  else:
    print "Usage: ", sys.argv[0], "datadir backupdir"
    sys.exit()
  source_files = compare_me(dir1, dir2)
  dir1 = os.path.abspath(dir1)
  if not dir2.endswith('/'):
    dir2 = dir2 + '/'
  dir2 = os.path.abspath(dir2)
  destination_files = []
  createdir_bool = False
  for item in source_files:
    destination_dir = re.sub(dir1, dir2, item)
    destination_files.append(destination_dir)
    if os.path.isdir(item):
      if not os.path.exists(destination_dir):
        os.makedirs(destination_dir)
        createdir_bool = True
   ##对应第三个步骤
  if createdir_bool:
    destination_files = []
    source_files = []
    source_files = compare_me(dir1, dir2)
    for item in source_files:
      destination_dir = re.sub(dir1, dir2, item)
      destination_files.append(destination_dir)
  ##对应第四个步骤
  print "update item: "
  print source_files
  copy_pair = zip(source_files, destination_files)
  print "copy_pair is %s" % copy_pair
  for item in copy_pair:
    print "item is %s, %s" % (item[0], item[1])
    if os.path.isfile(item[0]):
      shutil.copyfile(item[0], item[1])
if __name__ == '__main__':
  main()

代码解析

上述代码主要包含两个函数:compare_me和main。

  • compare_me函数:该函数接收两个目录路径作为参数,使用filecmp.dircmp比较这两个目录。它提取出仅在源目录中存在的文件(left_only)和两个目录中存在但内容不同的文件(diff_files)。然后,它递归地比较两个目录共有的子目录,并将所有差异文件的路径添加到holderlist列表中。
  • main函数:该函数首先检查命令行参数,确保提供了源目录和备份目录的路径。然后,它调用compare_me函数获取差异文件列表。接下来,它遍历差异文件列表,将源目录中的文件路径替换为备份目录中对应的路径。如果备份目录中对应的子目录不存在,则创建该目录。最后,它遍历差异文件列表,将源目录中的文件复制到备份目录中。

注意事项

  • 确保源目录和备份目录的路径正确无误。
  • 在执行脚本前,建议先手动检查源目录和备份目录的内容,以确保备份操作的正确性。
  • 如果备份目录中已经存在与源目录相同的文件,脚本不会覆盖这些文件,除非它们的内容发生了变化。
  • 可以通过修改main函数中的参数,实现不同的备份策略,例如只备份新增文件、只备份修改文件等。

以上就是Python实现源目录与备份目录差异对比及自动同步备份的详细内容,更多关于Python目录备份、文件同步的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表