目前,在进行增量数据迁移后,我需要比较目录。我编写了一个python脚本来遍历源/目标列表,执行从源到目标的增量复制,然后立即比较每个目录中的文件和文件夹数。为了进行比较,我们非常简单地使用:


  用于os.walk(destd)中的(路径,目录,文件):
  
  destFileCount + = len(文件)
  
  destDirCount + = len(dirs)


如果返回的文件/目录数不同,我们调用另一部分代码以查看到底有什么不同。为此,我们运行以下命令并将输出发送到文件:


  filecmp.dircmp(来源,destd).report_full_closure()


我们使用report_full_closure件,因为我不知道另一种进行递归比较的方法。然后,脚本在结果文件中搜索以“ only in”开头的行,并将它们打印到屏幕上,从而有效地向我们显示了差异。

不管效率如何,它在少于90,000个文件左右的目录上都像是一种魅力,但是一旦达到该上限,脚本就会变得缓慢,以至于无法将其用于此目的。我想我的问题可以分为以下几类:


使用这两个模块[os.walk + filecmp.dircmp()。report_full_closure()]时是否出现逻辑错误?即,我是否真的在节省时间来跳过filecmp,还是应该只做filecmp并完全跳过文件/目录计数?
有没有办法通过某种方式“缓存”文件中的一种以供另一种使用来组合这两种功能?
有没有一种执行这些功能的快捷方法?我搜索过高低,所以我猜没有。


非常感谢您对此事的想法。该脚本已经变形并大量增加,如果答案非常明显,请原谅我...
谢谢,
中号

最佳答案

我会做这样的事情:

dir_diff = filecmp.dircmp(sourced, destd)
if dir_diff.left_only or dir_diff.right_only:
    dir_diff.report_full_closure()


编辑:
这是nice blog about filecmp module

dircmp返回的差异不正确可能有两个原因:
1.它使用os.stat来比较文件(浅比较),这在大多数情况下是好的,但是您的要求可能有所不同。
2.有趣的文件-将文件重命名为目录等,显示在common下。因此,您还需要考虑dir_diff.common_funny。这是修改后的代码:

dir_diff = filecmp.dircmp(sourced, destd)
if dir_diff.left_only or dir_diff.right_only or dir_diff.common_funny:
    dir_diff.report_full_closure()

08-04 11:10