Как я могу вычислить контрольную сумму md5 каталога? - PullRequest
125 голосов
/ 01 ноября 2009

Мне нужно вычислить итоговую контрольную сумму md5 для всех файлов определенного типа (например, *.py), размещенных в каталоге и всех подкаталогах.

Каков наилучший способ сделать это?

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

Ответы [ 16 ]

2 голосов
/ 02 ноября 2009

Технически вам нужно всего лишь запустить ls -lR *.py | md5sum. Если вы не беспокоитесь о том, что кто-то изменил файлы и вернул их к исходным датам и никогда не изменил размеры файлов, вывод ls должен сообщить вам, изменился ли файл. У меня unix-foo слабый, поэтому вам может потребоваться еще несколько параметров командной строки, чтобы получить время создания и модификации для печати. ls также сообщит вам, изменились ли разрешения для файлов (и я уверен, что есть переключатели, чтобы отключить это, если вам это не важно).

2 голосов
/ 01 ноября 2009

GNU найти

find /path -type f -name "*.py" -exec md5sum "{}" +;
1 голос
/ 25 ноября 2013

Если вы действительно хотите независимость от атрибутов файловой системы и от различий на уровне битов некоторых версий tar, вы можете использовать cpio:

cpio -i -e theDirname | md5sum
1 голос
/ 17 марта 2013

У меня была такая же проблема, поэтому я придумал этот скрипт, который просто перечисляет суммы md5 файлов в каталоге и, если он находит подкаталог, он снова запускается оттуда, чтобы это произошло, скрипт должен быть в состоянии запустить через текущий каталог или из подкаталога, если указанный аргумент передается в $ 1

#!/bin/bash

if [ -z "$1" ] ; then

# loop in current dir
ls | while read line; do
  ecriv=`pwd`"/"$line
if [ -f $ecriv ] ; then
    md5sum "$ecriv"
elif [ -d $ecriv ] ; then
    sh myScript "$line" # call this script again
fi

done


else # if a directory is specified in argument $1

ls "$1" | while read line; do
  ecriv=`pwd`"/$1/"$line

if [ -f $ecriv ] ; then
    md5sum "$ecriv"

elif [ -d $ecriv ] ; then
    sh myScript "$line"
fi

done


fi
0 голосов
/ 10 ноября 2018

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

find . -type f -print0 \ | xargs -r0 md5sum \ | grep -v ".env" \ | grep -v "vendor/autoload.php" \ | grep -v "vendor/composer/" \ | sort -d \ | md5sum

0 голосов
/ 29 января 2016

Есть еще два решения:

Создать:

du -csxb /path | md5sum > file

ls -alR -I dev -I run -I sys -I tmp -I proc /path | md5sum > /tmp/file

Проверка:

du -csxb /path | md5sum -c file

ls -alR -I dev -I run -I sys -I tmp -I proc /path | md5sum -c /tmp/file
...