Мне нужно сравнить md5sums из 80 копий одного и того же файла друг с другом и сообщить об ошибке при несоответствии. Как я могу сделать это эффективно в bash? Я ищу элегантный алгоритм для этого.Как сравнить 80 md5sums друг с другом в bash
ответ
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-
Это напечатает имена файлов большинства файлов.
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
'sed 's /. * $ //'' менее критически написан 'cut -d '' -f1', но +1. –
Или еще менее критически: 'awk '{print $ 1}'' –
Я работал над более крупным решением, которое идентифицировало бы файлы с другой суммой, но, вероятно, не стоит огромного количества дополнительной работы над вашим одним лайнером. Кроме того, вы всегда можете «md5sum FILES | grep BADSUM» найти файл с плохими суммами позже –
Выход:
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
, чтобы получить отсчеты в порядке убывания, так что девиантные файлы появляются в прошлом).У вас есть имена дубликатов файлов, сгруппированных вместе, и подсчет, указывающий вам, сколько их дубликатов. То, что вы делаете дальше, зависит от вас.
Настоящий сценарий производства будет использовать временные имена файлов, а не жестко закодированные имена, конечно, и очистится после себя.
- 1. сравнить символ * друг с другом
- 2. Как сравнить атрибуты друг с другом
- 3. greenDAO: сравнить два свойства друг с другом
- 4. Eclipse RCP Сравнить друг с другом команда
- 5. Как сравнить каждое число в массиве друг с другом? (javascript)
- 6. Как сравнить массивы внутри массива друг с другом в рубине?
- 7. Как сравнить значения внутри списка друг с другом в C#
- 8. Linux: Как сравнить все файлы в каталоге друг с другом?
- 9. WPF ValidationRule - Как сравнить два значения друг с другом
- 10. Как сравнить несколько значений объекта друг с другом?
- 11. Как сравнить всю длину вложенных дочерних элементов друг с другом?
- 12. Как сравнить каждый элемент массива друг с другом?
- 13. Как сравнить два списка <String> друг с другом?
- 14. сравнить каждую строку в двух векторах друг с другом
- 15. Найти данные в двух списках и сравнить друг с другом
- 16. Тестирование, если два Java-объекта можно сравнить друг с другом
- 17. python 3.5.0 ::: Сравнить значения внутри списков друг с другом
- 18. Невозможно сравнить два массива символов друг с другом
- 19. Сравнить файлы рядом друг с другом, используя беспроигрышная пакетный сценарий
- 20. Как поставить кнопки рядом друг с другом?
- 21. Как сравнить переменные в bash
- 22. Сравнение элементов массиваList друг с другом
- 23. Как сравнить строки в bash?
- 24. Сравнение XML рядом друг с другом
- 25. Сравнение элементов массива друг с другом
- 26. Как сравнить ключ друг с другом в словаре с помощью javascript
- 27. Сравнение двух дат календаря друг с другом
- 28. ViewModels разговаривают друг с другом
- 29. Отображать четыре файла рядом друг с другом
- 30. Выровняйте TextView рядом друг с другом - Android
Итак, все эти файлы должны быть одинаковыми, и вы пытаетесь найти все, что нет? –