6

Контекст:

У меня большой терабайтный диск с различными типами больших медиа-файлов, ISO-файлов и т.д. Я хотел бы проверить его содержимое, используя md5sum на первом мегабайте из-за скорости / производительности.

Вы можете создать сумму как это:

FILE=four_gig_file.iso
SUM=$(head -c 1M "$FILE" | md5sum)
printf "%s *%s\n" ${SUM%-} "$FILE" >>test.md5

Как бы вы проверили это, поскольку подпись первого мегабайта отличается от подписи всего файла?

Я видел это на других языках, но мне интересно, как это сделать на Bash. Я экспериментировал с различными перестановками md5sum -c включая каналы и еще много чего.


Вместо того, чтобы использовать md5sum -c , вам придется пересчитывать хэши в новый файл, а затем 'diff' их?

Вы можете использовать

find /directory/path/ -type f -print0 | xargs -0 md5sum blah blah

работать с большим количеством файлов.

PS: Rsync не вариант

ОБНОВЛЕНИЕ 2: так, как оно есть -

Используя head, find и md5sum; затем можно довольно быстро создать файл из исходного каталога, а затем проверить его с помощью diff на другой стороне после вычисления места назначения. Есть ли для этого умные однострочники или сценарии?

1 ответ1

6

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

Если вы хотите проверить целостность данных, вам лучше использовать алгоритм CRC32. Это быстрее, чем MD5. Хотя существует возможность подделать / изменить файл так, чтобы он имел правильную сигнатуру CRC32, маловероятно, что случайные биты повреждения когда-либо будут делать это.

Обновить:

Вот хороший пример того, как сделать контрольную сумму md5 на основе 1 мегабайта для каждого файла:

find ./ -type f -print0 | xargs -0 -n1 -I{} sh -c "echo '{}' >> output.md5 && head -c 1M '{}' | md5sum >> output.md5"

Замените md5sum на cksum, если хотите. Обратите внимание, что я решил включить имя файла в вывод. Это потому, что строка имени файла не передается, когда вы не даете md5sum весь файл.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .