使用python filecmp模块的dircmp类可以很方便的比对两个目录,dircmp的用法已经有很多文章介绍,不再赘述。

可以help(filecmp.dircmp)查看帮助信息,其中提到的x.report()、x.report_partial_closure(),都只能打印两目录一级子目录的比较信息。而x.report_full_closure()可以递归打印所有子目录的比对信息,但是输出太多,大多数情况下我们可能只关心两目录的不同之处。

help(filecmp.dircmp) 摘选:                                             |  High level usage:                                                        |    x = dircmp(dir1, dir2)                                                 |    x.report() -> prints a report on the differences between dir1 and dir2 |     or                                                                    |    x.report_partial_closure() -> prints report on differences between dir1|          and dir2, and reports on common immediate subdirectories.        |    x.report_full_closure() -> like report_partial_closure,                |          but fully recursive.                 

    本文编写的脚本,重点关注并实现两个目标:1)递归比对两个目录及其所有子目录。2)仅输出两目录不同之处,包括文件名相同(common_files)但是文件不一致(diff_files),以及左、右目录中独有的文件或子目录。

py脚本compare_dir.py内容如下:

# -*- coding: utf-8 -*-
"""
@desc 使用filecmp.dircmp递归比对两个目录,输出比对结果以及统计信息。
@author longfeiwlf
@date 2020-5-20
"""from filecmp import dircmp
import sys# 定义全局变量:
number_different_files = 0    # 文件名相同但不一致的文件数
number_left_only = 0    # 左边目录独有的文件或目录数
number_right_only = 0   # 右边目录独有的文件或目录数def print_diff(dcmp):"""递归比对两目录,如果有不同之处,打印出来,同时累加统计计数。"""global number_different_filesglobal number_left_onlyglobal number_right_onlyfor name in dcmp.diff_files:print("diff_file found: %s/%s" % (dcmp.left, name))number_different_files += 1for name_left in dcmp.left_only:print("left_only found: %s/%s" % (dcmp.left, name_left))number_left_only += 1for name_right in dcmp.right_only:print("right_only found: %s/%s" % (dcmp.right, name_right))number_right_only += 1for sub_dcmp in dcmp.subdirs.values():print_diff(sub_dcmp)    # 递归比较子目录if __name__ == '__main__':try:mydcmp = dircmp(sys.argv[1], sys.argv[2])except IndexError as ie:print(ie)print("使用方法:python compare_dir_cn.py 目录1 目录2")else:print("\n比对结果详情: ")print_diff(mydcmp)if (number_different_files == 0 and number_left_only == 0and number_right_only == 0):print("\n两个目录完全一致!")else:print("\n比对结果统计:")print("Total Number of different files is:  " + str(number_different_files))print("Total Number of files or directories only in '"+ sys.argv[1] + "' is:  " + str(number_left_only))print("Total Number of files or directories only in '"+ sys.argv[2] + "' is:  " + str(number_right_only))

compare_dir.py脚本使用举例:

filecmp.dircmp实现递归比对两个目录相关推荐

  1. 用递归法求两个数的最大公约数

    用递归法求两个数的最大公约数 求两个数的最大公约数的思路是,用辗转现除法 辗转相除法求两个数的最大公约数的步骤如下: 先用小的一个数除大的一个数,得第一个余数: 再用第一个余数除小的一个数,得第二个余 ...

  2. 递归和循环两种方法完成树的镜像转换

    /* copyright@nciaebupt 转载出处:http://blog.csdn.net/nciaebupt/article/details/8506038 题目:输入一颗二元查找树,将该树转 ...

  3. 编写函数求两个数的最大公约数,采用递归法计算两数的最大公约数。

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: [实验案例3:函数的递归调用] 编写函数求两个数的最大公约数,采用递归法计算两数的最大公约数. [实验指导] 分析:m.n为两 ...

  4. 分别采用递归和非递归方式编写两个函数,求一棵二叉树中叶子节点个数

    分别采用递归和非递归方式编写两个函数,求一棵二叉树中叶子节点个数 #include #include #define MAXSIZE 50 typedef char datatype; typedef ...

  5. 【文件和递归】File:创建功能,删除功能,重命名功能,判断功能,基本获取功能,高级获取功能,断有没有.png后的文件,递归:归注意事项,用代码求出实现5的阶乘,不死神兔案例,递归删除带内容的目录

    一. 文件 我们想要实现IO操作,就必须要知道硬盘上文件的表现形式 Java提供了一个类让我们操作硬盘上的文件:File File也就是文件表现形式 1.File:文件和目录(文件夹)路径名的抽象表示 ...

  6. .. 相对目录php,php 计算两个目录的相对路径

    计算两个目录的相对路径,网上有好多代码,发现好多是用array_diff_assoc这个函数,这样不对. /** * Created by PhpStorm. * User: 优美代码 * Date: ...

  7. 使用python对比两个目录下的文件名差异

    前言 在做深度学习图像识别相关的项目,经常会使用到标注工具对图像进行标注,然后会在对应文件夹下生成文件名相同的标签文件,比如000023.jpg,标注后会生成000023.xml,或都000023.t ...

  8. 用 Python 对比两个目录下的内容,并生成 Json 文件

    一.背景 两个文件夹下,可能有相同名字的文件,也可能有不同名字的文件,相同名字的文件也有可能内容不同,因此需要对比,将结果输出到 Json 文件. 二.思路 先获取两个目录,然后分别遍历目录下的所有文 ...

  9. linux比较两个目录的差异

    diff 给定两个目录,如何找出哪些文件因内容不同 > diff --brief --recursive dir1/ dir2/ --brief仅显示有无差异 或者使用 > diff -q ...

  10. 怎么使用Diff和Meld工具发现两个目录间的不同之处

    在之前的一篇文章里,我们回顾了 Linux 下 9 个最好的文件比较工具,本篇文章中,我们将会描述在 Linux 下怎样找到两个目录之间的不同. 一般情况下,要在 Linux 下比较两个文件,我们会使 ...

最新文章

  1. 32位系统和64位系统的辨别
  2. SQL Server通过动态视图里查找阻塞超过30秒的会话
  3. 借助 Subversion 进行版本控制
  4. C++ 模板(template) 的定义
  5. java中大数开方_大数开方(Java版)
  6. linux上的那些查找的命令
  7. android ——多线程编程
  8. hadoop SecondNamenode
  9. 女车主车顶控诉“特斯拉刹车失灵”,结果被大汉抬走!车展变维权现场...
  10. C/C++中static关键字的作用
  11. 惠普打印机驱动安装找不到打印机
  12. 全志F1C100s使用记录:资料索引与基础说明
  13. centos时间同步方案
  14. 爱站网关键词挖掘查询工具-批量网站关键词挖掘导出软件免费下载
  15. 计算机制作通知的具体步骤,关于举办2018年镇江市中小学电脑制作活动的通知...
  16. linux开机出现initramfs无法进入系统
  17. python之使用cmd命令行写程序
  18. Python Tutorial中英双语对照文档5
  19. artifact is missing.
  20. 老调重弹-access注入过主机卫

热门文章

  1. 初中英语语法(010)-分词
  2. ethool工具之TSO、UFO、GSO、LRO、GRO和RSS介绍
  3. 离散Hopfield神经网络摘记
  4. EXCEL合并单元格内容并换行显示
  5. Java 对 Excel 修改
  6. VMware ESXi 7.0 U2 SLIC Unlocker USB 网卡驱动集成镜像
  7. unity 无法打包
  8. vue 表格固定首行首列(纯css)
  9. Cannot mix different versions of joi schemas错误
  10. 【教程】如何查看自己的外网ip是不是公网ip