Поиск отсутствующих файлов по контрольной сумме - PullRequest
2 голосов
/ 09 июня 2010

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

Я хотел бы написать скрипт для генерации списка файлов, которые находятся в F1, но не в F2, то есть тех, которые не были скопированыСкрипт миграции в новую иерархию, так что я могу вернуться и перенести их вручную.К сожалению, по причинам, не заслуживающим внимания, скрипт миграции не может быть изменен, чтобы вывести список файлов, которые он не переносит.Мой вопрос отличается от , на который ранее был дан ответ , из-за того, что я не могу полагаться на имена файлов в качестве сравнения.

Я знаю, что основная схема процесса будет такой:

  1. Создайте список контрольных сумм для всех файлов, повторяя через F1
  2. Сделайте то же самое для F2
  3. Сравните списки и сгенерируйте отрицательное пересечение контрольных сумм, игнорируя имена файлов,чтобы найти файлы, которые являются в F1, но не в F2.

Я немного застрял, пройдя этот этап, поэтому я был бы признателен за любые указания, какие инструменты использовать,Я думаю, что мне нужно использовать команду 'comm', чтобы сравнить список контрольных сумм файлов, но так как md5sum , sha512sum и т.п., поместите имя файла рядом с контрольной суммой, я могуНе вижу способа, чтобы это принесло мне полезное сравнение.Может быть, awk это путь?

Я использую Red Hat Enterprise Linux 5.x.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 09 июня 2010

Вы можете сделать что-то вроде этого:

f1# find yourrootdir -type f -exec sha1sum {} >> initial_files \; 
f1# ...copy initial_files to machine f2...
f1# ...start copy...
f2# find yournewrootdir -type f -exec sha1sum {} >> final_files \;
f2# sort initial_files > INITIAL
f2# sort final_files > FINAL
f2# for sha1 in `comm -23 <(cat INITIAL | awk '{print $1}') <(cat FINAL | awk '{print $1}')`; do grep $sha1 INITIAL; done

Это покажет строки в "initial_files", которые не имеют SHA1 в final_files.

Последняя строка использует толькоsha1sums для выполнения команды comm, затем добавляет в initial_files каждый пропущенный sha1sum.

2 голосов
/ 09 июня 2010

На F1:

# find / -type f -exec md5sum {} + > F1

На F2:

# find / -type f -exec md5sum {} + > F2

затем:

# diff F1 F2

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

1 голос
/ 09 июня 2010

Возможно, взгляните на исходный код FSLint для указателей: http://code.google.com/p/fslint/source/browse/trunk/fslint/findup

...