加快Cygwin上的文件比较(使用`cmp`)?

Bro*_*ses 6 bash cygwin

我已经在Cygwin上写了一个bash脚本,这个脚本非常相似rsync,虽然不同,我相信我实际上并不能rsync用于我需要的东西.它迭代相应目录中的大约一千对文件,并与之进行比较cmp.

不幸的是,这似乎非常缓慢 - 大约十(编辑:实际上是25!)次,只要使用Python程序生成一组文件.

我是否正确地认为这是非常缓慢的?有没有简单的替代方案会更快?

(详细说明我的用例:我.c在一个临时目录中自动生成一堆文件,当我重新生成它们时,我只想将已经更改的文件复制到实际的源目录中,未更改的未更改(使用旧的创建时间)以便make知道它不需要重新编译它们..c但是,并非所有生成的文件都是文件,所以我需要进行二进制比较而不是文本比较.)

Jon*_*ler 3

也许您也应该使用 Python 来完成部分甚至全部比较工作?

一项改进是仅cmp在文件大小相同时才运行;如果它们不同,则显然文件已更改。cmp您可以考虑使用 MD5 或 SHA1 或 SHA-256 或任何您喜欢的东西(使用 Python 模块或扩展,如果这是正确的术语)为每个文件生成哈希,而不是运行。如果您认为自己不会处理恶意意图,那么 MD5 可能足以识别差异。

即使在 shell 脚本中,您也可以运行外部哈希命令,并为其提供一个目录中所有文件的名称,然后为其提供另一目录中所有文件的名称。然后,您可以读取两组哈希值和文件名,并确定哪些已更改。

是的,听起来确实花费了太长时间。但麻烦在于必须发行 1000 份cmp,再加上其他处理。上面的 Python 和 shell 脚本建议有一个共同点,那就是它们可以避免运行程序 1000 次;他们试图尽量减少执行的程序数量。我预计,执行的进程数量的减少将为您带来巨大的收益。


如果您可以保留“当前文件集”中的哈希值,并简单地为新文件集生成新的哈希值,然后比较它们,那么您会做得很好。显然,如果包含“旧哈希值”(当前文件集)的文件丢失,您将必须从现有文件重新生成它。这稍微充实了评论中的信息。

另一种可能性:您能否跟踪用于生成这些文件的数据的更改,并使用它来告诉您哪些文件将发生更改(或者至少限制可能已更改并因此需要更改的文件集)比较,因为您的评论表明大多数文件每次都是相同的)。

  • MD5 和其他哈希版本的好处是您可以存储哈希,而不是在下一次迭代时执行逐字节比较。如果每次对旧文件和新文件都重新计算 MD5,则没有太大区别。 (2认同)
  • 郑重声明:我发现Python有一个“filecmp.cmp()”库函数,它本质上等同于“cmp”,所以我尝试将我的脚本翻译成Python。事实证明,几乎可以完全逐字地执行此操作,并且执行时间从 197.2 秒下降到 10.4 秒,与生成文件所需的 8.1 秒相当,而且更容易忍受! (2认同)