Как я могу сравнить две директории для сравнения отсутствующих файлов, если директории не имеют одинаковую структуру?
Мне прислали жесткий диск с новыми и обновленными файлами от организации, с которой мы работаем, но у нас уже есть большинство файлов на наших серверах, и мы хотели бы обновить наши локальные версии, чтобы они соответствовали их.
Обычно, это было бы работой для чего-то вроде rsync, но наша проблема в том, что структура каталогов, которую они предоставляют, очень плохо организована, и нам приходилось переставлять их файлы в прошлом, чтобы лучше работать с нашими системами.
Итак, мой вопрос:
Как я могу узнать, какие файлы в предоставленном ими наборе являются новыми или отличаются от имеющихся у нас версий, когда структуры каталогов отличаются?
После ответа на этот вопрос мы можем обновить измененные файлы и определить, куда поместить новые файлы в нашей системе, возможно, несколько вручную.
2 ответа
Хорошо, вот моя первая попытка чего-то. Кажется, это работает достаточно хорошо для того, что мне нужно, но я открыт для лучших предложений:
Во-первых, получите md5 суммы всех файлов в нашей файловой системе и новые данные:
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" может применяться ко многим отделам), то как вы узнаете, когда вы обновляете существующий файл, а не перезаписываете существующий файл несвязанным контентом?
Я бы допустил ошибку и сохранил все, включая пути к файлам. Вы можете идентифицировать идентичные файлы и создавать символические ссылки на оригиналы для системы дедупликации бедного человека, но в действительности ваша система хранения должна справиться с этим за вас. Худший сценарий - уничтожение пользовательских данных только для экономии места.