Linux: вычислить один хеш для данной папки и содержимого? - PullRequest
69 голосов
/ 13 февраля 2009

Наверняка должен быть способ сделать это легко!

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

Мне нужно сгенерировать один хеш для всего содержимого папки (не только для имен файлов).

Я бы хотел сделать что-то вроде

sha1sum /folder/of/stuff > singlehashvalue

Редактировать: чтобы уточнить, мои файлы находятся на нескольких уровнях в дереве каталогов, они не все находятся в одной корневой папке.

Ответы [ 14 ]

0 голосов
/ 08 марта 2018

Вот простой, короткий вариант в Python 3, который отлично работает для небольших файлов (например, дерева исходных текстов или чего-то, где каждый файл может легко помещаться в ОЗУ), игнорируя пустые каталоги, основываясь на идеях других решения:

import os, hashlib

def hash_for_directory(path, hashfunc=hashlib.sha1):                                                                                            
    filenames = sorted(os.path.join(dp, fn) for dp, _, fns in os.walk(path) for fn in fns)         
    index = '\n'.join('{}={}'.format(os.path.relpath(fn, path), hashfunc(open(fn, 'rb').read()).hexdigest()) for fn in filenames)               
    return hashfunc(index.encode('utf-8')).hexdigest()                          

Работает так:

  1. Рекурсивно найти все файлы в каталоге и отсортировать их по имени
  2. Рассчитать хэш (по умолчанию: SHA-1) каждого файла (считывает весь файл в память)
  3. Создание текстового индекса со строками «filename = hash»
  4. Кодировать этот индекс обратно в байтовую строку UTF-8 и хэшировать, что

Вы можете передать другую хеш-функцию в качестве второго параметра, если SHA-1 не является вашей чашкой чая.

0 голосов
/ 28 января 2018

Мне пришлось проверить весь каталог на предмет изменений файла.

Но с исключением, отметок времени, владельцев каталогов.

Цель состоит в том, чтобы получить одинаковую сумму в любом месте, если файлы идентичны.

Включая размещение на других машинах, независимо от файлов, или изменений в них.

md5sum * | md5sum | cut -d' ' -f1

Он генерирует список хэшей по файлам, затем объединяет эти хэши в один.

Это намного быстрее, чем метод tar.

Для большей конфиденциальности в наших хешах мы можем использовать sha512sum по тому же рецепту.

sha512sum * | sha512sum | cut -d' ' -f1

Хэши также везде идентичны, используя sha512sum , но не существует никакого известного способа изменить его.

0 голосов
/ 13 февраля 2009

Вы можете sha1sum создать список значений хеш-функции, а затем sha1sum этот список снова, это зависит от того, чего именно вы хотите достичь.

0 голосов
/ 13 февраля 2009

Попробуйте сделать это в два этапа:

  1. создать файл с хешами для всех файлов в папке
  2. хэш этого файла

Вот так:

# for FILE in `find /folder/of/stuff -type f | sort`; do sha1sum $FILE >> hashes; done
# sha1sum hashes

Или сделать все сразу:

# cat `find /folder/of/stuff -type f | sort` | sha1sum
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...