Назад | Перейти на главную страницу

Как я могу сравнить два каталога для сравнения отсутствующих файлов, если у каталогов разная структура?

Мне прислали жесткий диск с новыми и обновленными файлами от организации, с которой мы работаем, но у нас уже есть большинство файлов, находящихся на наших серверах, и мы хотели бы обновить наши локальные версии, чтобы они соответствовали их.

Обычно это работа для чего-то вроде 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» может применяться ко многим отделам), то как узнать, что вы обновляете существующий файл, а не перезаписываете существующий файл несвязанным содержимым?

Я бы ошибся и оставил все, включая пути к файлам. Вы можете идентифицировать идентичные файлы и создавать символические ссылки на оригиналы для системы дедупликации бедняков, но на самом деле ваша система хранения должна справиться с этим за вас. В худшем случае пользовательские данные удаляются просто для экономии места.