如何校验和并验证文件系统上的所有文件

如何校验和并验证文件系统上的所有文件

我想对所有文件递归运行 sha1sum 或 md5sum,将结果存储到一个文件(或几个文件)中,然后能够再次扫描文件以验证文件的完整性。

sha1sum/md5sum 等工具不允许递归,并且我还想分散负载,以便它使用多个 CPU 核心。

我还觉得将文件放在 BTRFS 上不太安全,而且 BTRFS 在 raid5/6 上还不能正常工作,所以我正在寻找一种“快速”的方法来校验我的所有文件,并在需要时验证它们。这样我至少可以知道静默数据损坏是否妨碍了我的任何文件。

是否存在专门为此目的而设计的工具(是的,我知道 SnapRAID)

答案1

这些工具或多或少适用于以下用例:

http://md5deep.sourceforge.net/

答案2

或者你可以自己写点东西;)我用 Python 编写了这个脚本,合并了网络上其他人的片段。它可以作为一个起点。

/usr/bin/python 的 #!

导入操作系统
导入 hashlib
从 joblib 导入并行、延迟
导入 json

BASE_DIR = “/home/p/music”
进程数 = 2
OUT_FILE =“哈希.json”

# 要处理的文件列表
文件列表 = []
对于 os.walk(BASE_DIR) 中的 root、dir、files:
    对于文件中的名称:
        file_list.append(os.path.join(root,name))


#——对单个文件进行md5sum计算
定义 hashOne(f):
    块大小 = 65536
    hasher = hashlib.md5()
    使用 open(f,'rb') 作为文件:
        打印 f
        buf = afile.read(块大小)
        当 len(buf) > 0 时:
            hasher.update(buf)
            buf = afile.read(块大小)
    返回 hasher.hexdigest()

# 并行计算md5sum    
md5 = Parallel(n_jobs=NUM_PROC)(file_list 中的 f 的延迟(hashOne)(f))

# 对 file_names -> md5sum 进行哈希处理
输出哈希值 = {}
对于范围内的 i (len (file_list)):
    out_hash[文件列表[i]] = md5[i]

# 将哈希“文件名 -> md5sum”写入磁盘以供将来使用
转储 = json.dumps(out_hash)
使用打开(OUT_FILE,“wb”)作为文件:
    文件.写入(转储)

相关内容