我们合作的一家机构向我发送了一个包含新文件和更新文件的硬盘,但是我们的服务器上已经有大部分文件了,因此我们希望更新我们的本地版本以匹配他们的版本。
通常,这将是 rsync 之类的工作,但我们的问题是它们提供的目录结构组织得很差,我们不得不重新排列它们的文件以便与我们的系统完美配合。
所以,我的问题是:
当目录结构不同时,我如何找出他们提供的集合中的哪些文件是新的或者与我们拥有的版本不同的?
一旦回答了这个问题,我们就可以更新已更改的文件,并确定将新文件放在系统上的位置,可能需要采取一些手动方式。
答案1
好的,这是我的第一次尝试。它似乎可以满足我的需求,但我愿意听取更好的建议:
首先,获取文件系统和新数据中所有文件的 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"
它将仅列出我们尚未拥有的媒体上的文件(或与我们拥有的文件不同的文件)。从那里我可以开始手动解决已知的差异。
答案2
您不必使用 MD5 来比较修改时间更改。话虽如此,您可能(除非数据集很大)将新文件和更新文件复制到本地存储,使用类似语法来识别重复项,然后使用修改时间(而不仅仅是 MD5sum)来协调其他所有内容。
一个重要的问题是,如果新存储上的路径不同,您如何知道文件是否已更新?如果文件名不唯一(例如,“2012 年 8 月销售报告.xls”可能适用于许多部门),那么您如何知道何时更新现有文件,何时用不相关的内容覆盖现有文件?
我会谨慎行事,保留所有内容,包括文件路径。您可以识别相同的文件并为穷人的重复数据删除系统创建指向原始文件的符号链接,但实际上您的存储系统应该为您处理这一点。最糟糕的情况是丢弃用户数据只是为了节省空间。