我想对所有文件递归运行 sha1sum 或 md5sum,将结果存储到一个文件(或几个文件)中,然后能够再次扫描文件以验证文件的完整性。
sha1sum/md5sum 等工具不允许递归,并且我还想分散负载,以便它使用多个 CPU 核心。
我还觉得将文件放在 BTRFS 上不太安全,而且 BTRFS 在 raid5/6 上还不能正常工作,所以我正在寻找一种“快速”的方法来校验我的所有文件,并在需要时验证它们。这样我至少可以知道静默数据损坏是否妨碍了我的任何文件。
是否存在专门为此目的而设计的工具(是的,我知道 SnapRAID)
答案1
这些工具或多或少适用于以下用例:
答案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”)作为文件: 文件.写入(转储)