我已经在Cygwin上写了一个bash脚本,这个脚本非常相似rsync
,虽然不同,我相信我实际上并不能rsync
用于我需要的东西.它迭代相应目录中的大约一千对文件,并与之进行比较cmp
.
不幸的是,这似乎非常缓慢 - 大约十(编辑:实际上是25!)次,只要使用Python程序生成一组文件.
我是否正确地认为这是非常缓慢的?有没有简单的替代方案会更快?
(详细说明我的用例:我.c
在一个临时目录中自动生成一堆文件,当我重新生成它们时,我只想将已经更改的文件复制到实际的源目录中,未更改的未更改(使用旧的创建时间)以便make
知道它不需要重新编译它们..c
但是,并非所有生成的文件都是文件,所以我需要进行二进制比较而不是文本比较.)
也许您也应该使用 Python 来完成部分甚至全部比较工作?
一项改进是仅cmp
在文件大小相同时才运行;如果它们不同,则显然文件已更改。cmp
您可以考虑使用 MD5 或 SHA1 或 SHA-256 或任何您喜欢的东西(使用 Python 模块或扩展,如果这是正确的术语)为每个文件生成哈希,而不是运行。如果您认为自己不会处理恶意意图,那么 MD5 可能足以识别差异。
即使在 shell 脚本中,您也可以运行外部哈希命令,并为其提供一个目录中所有文件的名称,然后为其提供另一目录中所有文件的名称。然后,您可以读取两组哈希值和文件名,并确定哪些已更改。
是的,听起来确实花费了太长时间。但麻烦在于必须发行 1000 份cmp
,再加上其他处理。上面的 Python 和 shell 脚本建议有一个共同点,那就是它们可以避免运行程序 1000 次;他们试图尽量减少执行的程序数量。我预计,执行的进程数量的减少将为您带来巨大的收益。
如果您可以保留“当前文件集”中的哈希值,并简单地为新文件集生成新的哈希值,然后比较它们,那么您会做得很好。显然,如果包含“旧哈希值”(当前文件集)的文件丢失,您将必须从现有文件重新生成它。这稍微充实了评论中的信息。
另一种可能性:您能否跟踪用于生成这些文件的数据的更改,并使用它来告诉您哪些文件将发生更改(或者至少限制可能已更改并因此需要更改的文件集)比较,因为您的评论表明大多数文件每次都是相同的)。