Мне нужно рассчитать итоговую контрольную сумму md5 для всех файлов определенного типа ( *.py
например), размещенных в каталоге и во всех подкаталогах.
Каков наилучший способ сделать это?
Изменить: предлагаемые решения очень хороши, но это не совсем то, что мне нужно. Я ищу решение для получения единой сводной контрольной суммы, которая будет однозначно идентифицировать каталог в целом - включая содержимое всех его подкаталогов.
Ответы:
Команда find выводит список всех файлов с расширением .py. Md5sum вычисляется для каждого файла .py. awk используется для получения сумм md5 (игнорируя имена файлов, которые могут быть не уникальными). Суммы md5 отсортированы. Затем возвращается md5sum этого отсортированного списка.
Я проверил это, скопировав тестовый каталог:
Я переименовал некоторые файлы в ~ / pybin2.
Команда
find...md5sum
возвращает одинаковые выходные данные для обоих каталогов.источник
awk ...
часть, если вы считаете макет частью подписи.Создайте файл архива tar на лету и направьте его
md5sum
:Это создает единственную md5sum, которая должна быть уникальной для вашего файла и настройки подкаталога. На диске не создаются файлы.
источник
ls -alR dir | md5sum
, Это даже лучше без сжатия, а просто чтение. Это уникально, потому что контент содержит мод и размер файла;)z
для gzip илиj
для bzip2. Я ни того, ни другого.tar
одного и того же набора файлов дважды или на двух разных компьютерах приведет к одинаковому точному результату.Предложение ire_and_curses об использовании
tar c <dir>
имеет некоторые проблемы:rsync -a --delete
делает, например : он синхронизирует практически все (за исключением xattrs и acls), но он будет синхронизировать владельца и группу на основе их идентификаторов, а не строкового представления. Поэтому, если вы синхронизировались с другой системой, которая не обязательно имеет одинаковых пользователей / группы, вы должны добавить--numeric-owner
флаг в tarПока нет решения для первой проблемы (или если вы не уверены, что это не влияет на вас), я бы не стал использовать этот подход.
На
find
основе решения , предложенные выше , не являются также не хорошо , потому что они включают в себя только файлы, не каталоги, что становится проблемой , если вас контрольной суммы следует иметь в виду пустые каталоги.Наконец, большинство предлагаемых решений не сортируются последовательно, потому что параметры сортировки могут быть разными в разных системах.
Это решение, которое я придумал:
Примечания об этом решении:
LC_ALL=C
для обеспечения надежного порядка сортировки в системах.-print0
флага для,find
но, поскольку здесь происходят другие вещи, я могу видеть только решения, которые сделают команду более сложной, чем она того стоит.PS: одна из моих систем использует ограниченный busybox,
find
который не поддерживает-exec
ни-print0
флаги, а также добавляет '/' для обозначения каталогов, в то время как findutils find, похоже, не работает, поэтому для этой машины мне нужно запустить:К счастью, у меня нет файлов / каталогов с символами новой строки в их именах, так что это не проблема для этой системы.
источник
Если вы заботитесь только о файлах, а не о пустых каталогах, это прекрасно работает:
источник
Для полноты картины есть md5deep (1) ; он не применим напрямую из-за требований к фильтру * .py, но должен работать вместе с find (1).
источник
Решение, которое работало лучше всего для меня:
Причина, почему это работает лучше всего для меня:
Вопросы с другими ответами:
Метаданные файловой системы не игнорируются для:
tar c - "$path" | md5sum
Не обрабатывает имена файлов, содержащие пробелы, и не определяет, был ли файл переименован:
источник
Если вы хотите, чтобы одна md5sum охватывала весь каталог, я бы сделал что-то вроде
источник
cat **.py
| md5sumКонтрольная сумма всех файлов, включая содержимое и их имена
То же, что и выше, но только с файлами * .py
Вы также можете следовать символическим ссылкам, если хотите
Другие варианты, которые вы могли бы рассмотреть с помощью grep
источник
GNU найти
источник
Технически вам нужно только бежать
ls -lR *.py | md5sum
. Если вы не беспокоитесь о том, что кто-то изменил файлы и вернул их к исходным датам и никогда не изменил размеры файлов, вывод командыls
должен сообщить вам, изменился ли файл. Мой unix-foo слабый, поэтому вам могут потребоваться дополнительные параметры командной строки, чтобы получить время создания и время модификации для печати.ls
также сообщит вам, изменились ли разрешения для файлов (и я уверен, что есть переключатели, чтобы отключить это, если вам это не интересно).источник
touch
изменяю дату (но не содержимое) файла, то я ожидаю, что контрольная сумма не изменится .Использование
md5deep
:md5deep -r FOLDER | awk '{print $1}' | sort | md5sum
источник
У меня была та же проблема, поэтому я придумал этот скрипт, который просто перечисляет md5-суммы файлов в каталоге, и если он находит подкаталог, он запускается снова оттуда, чтобы это произошло, скрипт должен иметь возможность запускать текущий каталог или из подкаталога, если указанный аргумент передается в $ 1
источник
Если вам нужна действительно независимость от атрибутов файловой системы и от различий на уровне битов некоторых версий tar, вы можете использовать cpio:
источник
Есть еще два решения:
Создайте:
Проверьте:
источник
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
источник