2012-02-14 1 views
1

Мне нужно сравнить md5sums из 80 копий одного и того же файла друг с другом и сообщить об ошибке при несоответствии. Как я могу сделать это эффективно в bash? Я ищу элегантный алгоритм для этого.Как сравнить 80 md5sums друг с другом в bash

+1

Итак, все эти файлы должны быть одинаковыми, и вы пытаетесь найти все, что нет? –

ответ

0
md5sum FILES > MD5SUMS.md5 
cut -c1-32 < MD5SUMS.md5 | sort | uniq -c | sort -n 

вернется что-то вроде этого:

1 485fd876eef8e941fcd6fc19643e5e59 
    1 585fd876eef8e941fcd6fc19643e5e59 
    5 385fd876eef8e941fcd6fc19643e5e59 

Чтение: 5 fi les имеют одну и ту же контрольную сумму, две другие имеют «индивидуальные» контрольные суммы. Я полагаю, что большинство правы, поэтому дополнительные

| tail -1 | cut -c 9- 

возвращает контрольную сумму последней строки. Теперь отфильтруйте все остальное (и соедините детали вместе):

md5sum FILES > MD5SUMS.md5 
grep -v "$(cut -c1-32 < MD5SUMS.md5 | sort | uniq -c | sort -n | tail -1 | cut -c 9-)" MD5SUMS.md5 | cut -c35- 

Это напечатает имена файлов большинства файлов.

3
md5sum FILES | sed 's/ .*$//' | sort -u 

Если вы получаете более одной строки вывода, у вас есть несоответствие.

(Это не говорит вам, где несоответствие.)

Собираем вместе, и заменив команду sed с несколько менее лаконичной awk команды:

count=$(md5sum "[email protected]" | awk '{print $1}' | sort -u | wc -l) 
if [ $count -eq 1 ] ; then 
    echo "Everything matches" 
else 
    echo "Nope" 
fi 
+0

'sed 's /. * $ //'' менее критически написан 'cut -d '' -f1', но +1. –

+0

Или еще менее критически: 'awk '{print $ 1}'' –

+0

Я работал над более крупным решением, которое идентифицировало бы файлы с другой суммой, но, вероятно, не стоит огромного количества дополнительной работы над вашим одним лайнером. Кроме того, вы всегда можете «md5sum FILES | grep BADSUM» найти файл с плохими суммами позже –

0

Выход:

md5sum $files | sort -k 1,2 

является список контрольных сумм в отсортированном порядке с соответствующими именами файлов впоследствии. Если вам нужно увидеть результаты, этого может быть достаточно. Если вам нужно определить результаты с нечетным мячом, вам необходимо принять решение о презентации. Вы говорите, что у вас 80 копий «того же файла». Предположим, что на самом деле 10 копий каждой из 8 версий «файла». Как вы собираетесь решать, что правильно, а что - поддельно? Что, если у вас есть 41 с одним хэшем и 39 с другим - уверены ли вы, что 39 ошибочны, а 41 правильный? Очевидно, что преобладает один хеш, но вам придется беспокоиться об этих призрачных граничных условиях.

Вы также можете сделать фантастические вещи, такие как:

md5sum $files | sort -k 1,2 > sorted.md5 
sed 's/ .*//' sorted.md5 | uniq -c | sed 's/^ *\([0-9][0-9]*\) \(.*\)/\2 \1/' > counted.md5 
join -j 1 -o 1.1,2.2,1.2 sorted.md5 counted.md5 

Это дает выход, состоящий из MD5 контрольной суммы, числа повторений, и имя файла. Первый скрипт sed можно заменить на awk '{print $1}', если хотите. Второй будет заменен на awk '{printf "%s %s\n", $2, $1}', который, вероятно, более ясен (и - это короче). Причиной этого фьюзинга является избавление от ведущих пробелов на выходе uniq -c, которые путают join.

md5sum $files | sort -k 1,2 > sorted.md5 
awk '{print $1}' sorted.md5 | uniq -c | awk '{printf "%s %s\n", $2, $1}' > counted.md5 
join -j 1 -o 1.1,2.2,1.2 sorted.md5 counted.md5 

Я создал некоторые файлы x1.h, x2.h и x3.h путем копирования dbatools.h и установите files=$(ls *.h). Выход был:

0763af91756ef24f3d8f61131eb8f8f2 1 dblbac.h 
10215826449a3e0f967a4c436923cffa 1 dbatool.h 
37f48869409c2b0554d83bd86034c9bf 4 dbatools.h 
37f48869409c2b0554d83bd86034c9bf 4 x1.h 
37f48869409c2b0554d83bd86034c9bf 4 x2.h 
37f48869409c2b0554d83bd86034c9bf 4 x3.h 
5a48695c6b8673373d30f779ccd3a3c2 1 dbxglob.h 
7b22f7e2373422864841ae880aad056d 1 dbstringlist.h 
a5b8b19715f99c7998c4519cd67f0230 1 dbimglob.h 
f9ef785a2340c7903b8e1ae4386df211 1 dbmach11.h 

Это может быть подвергнут дальнейшей обработке по мере необходимости (например, с sort -k2,3nr, чтобы получить отсчеты в порядке убывания, так что девиантные файлы появляются в прошлом).У вас есть имена дубликатов файлов, сгруппированных вместе, и подсчет, указывающий вам, сколько их дубликатов. То, что вы делаете дальше, зависит от вас.

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

Смежные вопросы