我对在两个存档的目录副本之间存储文件/目录完整性指标感兴趣。大约有 1TB 的数据以递归方式存储在硬盘上。有没有办法使用 OpenSSL 为所有文件生成一个哈希值,用于比较两个数据副本,或者在以后验证数据是否发生变化?
答案1
您可以递归生成所有哈希值,将哈希值连接成一个文件,然后生成该文件的哈希值。
答案2
您不能对它们全部进行累积哈希处理以生成单个哈希,但您可以先压缩它们然后计算哈希值:
$tar -czpf archive1.tar.gz folder1/
$tar -czpf archive2.tar.gz folder2/
$openssl md5 archive1.tar.gz archive2.tar.gz
递归地散列每个文件:
$find . -type f -exec openssl md5 {} +
答案3
除非所有元数据(创建日期等)都相同,否则对 tar 执行 md5 校验永远不会起作用,因为 tar 将其存储为其存档的一部分。
我可能会对所有文件的内容进行 md5 求和:
find folder1 -type f | sort | tr '\n' '\0' | xargs -0 cat | openssl md5
find folder2 -type f | sort | tr '\n' '\0' | xargs -0 cat | openssl md5
答案4
最好为每个文件列出一个哈希值,然后检查每个哈希值。如果您对所有文件进行哈希处理,而其中一个文件损坏了,那么您将不知道哪个文件损坏了。但是,如果您为每个文件列出哈希值,脚本可以告诉您何时任何哈希值不匹配(这将告诉您文件已损坏或更改)。
此外,递归散列find
比管道更简单:
find . -type f -print0 | xargs -0 openssl dgst -sha256 -r >> hashes.sha256
您需要通过 附加输出>>
,因为 xargs 将调用openssl
多次,但只在需要的时候处理所有文件(例如,不是每个文件一次调用)。-r
用于 coreutils 哈希文件语法。您不想使用 OpenSSL 的-out
,xargs
因为它会在每次调用时覆盖文件。此外,您可能希望捕获 STDERR,以防 OpenSSL 无法读取/打开某些文件:2>> error.log
如果存储不是瓶颈,那么您可以使用参数-P n
并行xargs
运行多个 OpenSSL 进程(不推荐用于硬盘)。
注意:GNU coreutils(md5sum 等)使用 OpenSSL 作为哈希库。但是,如果您的核心实用程序非常过时,您可能仍想使用 OpenSSL:对硬件的支持SHA-哈希加速是最近才添加到 OpenSSL 中的。SHA1/SHA256 在没有加速的情况下可以比 MD5 更快,而且在有加速的情况下绝对可以达到千兆位/秒的范围。