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

Такие инструменты, как sha1sum / md5sum, не допускают рекурсии, и я также хотел бы распределить нагрузку, чтобы использовать более одного ядра процессора.

Я пока не чувствую себя в безопасности, помещая свои файлы в BTRFS, и, кроме того, BTRFS еще не работает должным образом на raid5/6, поэтому я ищу "быстрый" способ проверить все мои файлы и проверить их в любое время. Таким образом, я бы по крайней мере узнал, не помешало ли какое-либо из моих файлов молчаливое повреждение данных.

Существуют ли какие-либо инструменты, предназначенные для этой цели (да, я знаю о SnapRAID)

2 ответа2

1

Эти инструменты предназначены для более или менее этого варианта использования:

http://md5deep.sourceforge.net/

1

Или вы можете написать что-нибудь самостоятельно;) Я написал этот скрипт на Python, объединяя фрагменты других людей из Интернета. Это может быть отправной точкой.

#!/usr/bin/python

import os
import hashlib
from joblib import Parallel, delayed
import json

BASE_DIR = "/home/p/music"
NUM_PROC = 2
OUT_FILE = "hashes.json"

# list of files to be processed
file_list = []
for root,dir,files in os.walk(BASE_DIR):
    for name in files :
        file_list.append(os.path.join(root, name))


# -- md5sum computation for a single file 
def hashOne(f):
    BLOCKSIZE = 65536
    hasher = hashlib.md5()
    with open(f, 'rb') as afile:
        print f
        buf = afile.read(BLOCKSIZE)
        while len(buf) > 0:
            hasher.update(buf)
            buf = afile.read(BLOCKSIZE)
    return hasher.hexdigest()

# parallel calculation of md5sum    
md5 = Parallel(n_jobs=NUM_PROC)(delayed(hashOne)(f) for f in file_list) 

# make an hash of file_names -> md5sum
out_hash = {}
for i in range(len(file_list)):
    out_hash[file_list[i]] = md5[i]

# write out the hash "filename -> md5sum" to disk for future 
dump = json.dumps(out_hash)
with open(OUT_FILE, "wb") as file:
    file.write(dump)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .