如何比较两个目录比较缺less的文件,当目录不具有相同的结构?

我已经从我们正在使用的一个组织发送了一个新的和更新的文件的硬盘驱动器,但是我们已经将大部分文件放在我们的服务器上,并且想要更新我们的本地版本以匹配他们的文件。

通常情况下,这将是一个像rsync这样的工作,但我们的问题是,他们提供的目录结构组织非常差,我们不得不重新安排他们的文件过去,以最好地与我们的系统。

所以,我的问题是:

当目录结构不同时,我怎样才能找出它们提供的集合中的哪些文件是新的还是不同于我们拥有的版本呢?

一旦这个问题得到解答,我们可以更新已更改的文件,并找出将新文件放在我们的系统中的位置,可能有点手动。

好的,这是我的第一次尝试。 它似乎工作适度我所需要的,但我打开更好的build议:

首先,获取文件系统和新数据中所有文件的md5sum:

 find /location/of/data -type f -exec md5sum {} ';' > our.md5sums find /media/newdisk -type f -exec md5sum {} ';' > their.md5sums 

我写了一个名为md5diff.py的简短Python脚本:

 #!/usr/bin/env python import sys print "Comparing", sys.argv[1], "to", sys.argv[2] # Create a dictionary based upon the hashes in source B dict = {} for line in open(sys.argv[2]): p = line.partition(' ') dict[p[0]] = p[2].strip() # Now go through source A and report where the file is in source B for line in open(sys.argv[1]): p = line.partition(' ') if p[0] in dict: print line.strip(), "(", sys.argv[2], ":",dict[p[0]], ")" else: print line.strip(), "NOT IN", sys.argv[2] 

所以现在我可以使用

 ./md5diff.py their.md5sums our.md5sums 

如果我添加| grep "NOT IN" | grep "NOT IN"不在| grep "NOT IN"它只会列出他们媒体上我们还没有(或不同于我们所拥有的)文件。 从他们我可以开始手动攻击已知的差异。

您不必MD5来比较修改时间的变化。 有了这个说法,你可能(除了一个庞大的数据集)复​​制新的和更新的文件到本地存储,使用像fslint工具来识别重复,然后使用修改时间(不只是MD5sums)协调一切。

一个重要的问题是,如果在新存储中path不同,您如何知道文件是否已经更新? 如果文件名不唯一(例如“2012年8月份的销售报告报告”可能适用于多个部门),那么如何知道何时更新现有文件与覆盖现有文件的不相关内容?

我会在谨慎的一面犯错,并保留一切,包括文件path。 您可以识别相同的文件,并为穷人的重复数据删除系统创build符号链接,但实际上您的存储系统应该为您处理。 最坏的情况是为了节省空间而摧毁用户数据。