Мне прислали жесткий диск с новыми и обновленными файлами от организации, с которой мы работаем, но у нас уже есть большинство файлов, находящихся на наших серверах, и мы хотели бы обновить наши локальные версии, чтобы они соответствовали их.
Обычно это работа для чего-то вроде rsync, но наша проблема в том, что структура каталогов, которую они предоставляют, очень плохо организована, и нам приходилось переупорядочивать их файлы в прошлом, чтобы лучше работать с нашими системами.
Итак, мой вопрос:
Как я могу узнать, какие файлы в предоставленном ими наборе являются новыми или отличаются от имеющихся у нас версий, если структура каталогов отличается?
После ответа на этот вопрос мы сможем обновить измененные файлы и решить, где разместить новые файлы в нашей системе, возможно, несколько вручную.
Хорошо, вот моя первая попытка чего-то добиться. Кажется, он неплохо работает для того, что мне нужно, но я открыт для лучших предложений:
Сначала получите md5sum всех файлов как в нашей файловой системе, так и новых данных:
find /location/of/data -type f -exec md5sum {} ';' > our.md5sums
find /media/newdisk -type f -exec md5sum {} ';' > their.md5sums
И я написал короткий скрипт на Python под названием md5diff.py:
#!/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"
он будет перечислять только те файлы на их носителе, которых у нас еще нет (или которые отличаются от того, что у нас есть). С их помощью я могу начать вручную атаковать известные различия.
Вам не нужно использовать MD5 для сравнения изменений времени модификации. С учетом сказанного, вы, вероятно, могли бы (за исключением огромного набора данных) скопировать новые и обновленные файлы в локальное хранилище, используя такой инструмент, как fslint для выявления дубликатов, затем используйте время модификации (а не только MD5-суммы), чтобы согласовать все остальное.
Один важный вопрос: как узнать, обновлен ли файл, если путь в новом хранилище не тот? Если имена файлов не уникальны (например, «Отчет о продажах за август 2012.xls» может применяться ко многим отделам), то как узнать, что вы обновляете существующий файл, а не перезаписываете существующий файл несвязанным содержимым?
Я бы ошибся и оставил все, включая пути к файлам. Вы можете идентифицировать идентичные файлы и создавать символические ссылки на оригиналы для системы дедупликации бедняков, но на самом деле ваша система хранения должна справиться с этим за вас. В худшем случае пользовательские данные удаляются просто для экономии места.