2

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

对于 os.walk(destd) 中的(路径、目录、文件):

destFileCount += len(文件)

destDirCount += len(dirs)

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

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

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

无论多么低效,这对于包含大约 90,000 个文件的目录来说就像一个魅力,但是一旦我们达到这个上限,脚本就会变得迟钝,以至于无法将其用于此目的。我想我的问题可以分为以下几点:

  1. 我在使用这两个模块 [os.walk + filecmp.dircmp().report_full_closure()] 时是否犯了逻辑错误?即,我真的可以跳过 filecmp 节省时间,还是应该只执行 filecmp 并完全跳过文件/目录计数?

  2. 有没有办法通过“缓存”一个文件以在另一个中使用来组合这两个功能?

  3. 有没有更快的方法来执行这些功能中的任何一个?我已经搜索了高低,所以我猜没有。

我非常感谢您对此事的看法。这个脚本已经变形和增长了很多,所以如果答案非常明显,请原谅我......谢谢你,M

4

1 回答 1

0

我会做这样的事情:

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

编辑:这是一个关于 filecmp 模块的不错的博客

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()
于 2012-06-28T06:11:51.303 回答