语境:
我有一个大型 TB 驱动器,其中包含各种类型的大型媒体文件、ISO 映像文件等。md5sum由于速度/性能,我想在第一兆字节上验证其内容。
您可以创建这样的总和:
FILE=four_gig_file.iso
SUM=$(head -c 1M "$FILE" | md5sum)
printf "%s *%s\n" ${SUM%-} "$FILE" >>test.md5
Run Code Online (Sandbox Code Playgroud)
您将如何验证这一点,因为第一兆字节的签名与整个文件的签名不同?
我见过用其他语言完成的,但我想知道如何在Bash 中完成。我已经尝试了md5sum -c涉及管道等的各种排列。
md5sum -c您是否必须将散列重新计算到一个新文件中,然后“区分”它们,而不是使用?
你可以使用一个
find /directory/path/ -type f -print0 | xargs -0 md5sum blah blah
Run Code Online (Sandbox Code Playgroud)
处理大量文件。
PS:Rsync 不是一个选项
更新 2:就目前而言——
使用 head、find 和 md5sum;然后可以相当快地从源目录创建一个文件,然后在目标计算后用另一端的 diff 检查它。是否有聪明的单行代码或脚本?
仅通过对文件的前兆字节进行采样来验证内容可能无法检测到某些较大的文件是否已以某种方式损坏、损坏或更改。这样做的原因是,当可能有数百个其他兆字节可能会关闭时,您只为散列算法提供了 1 兆字节的数据。即使是错误位置的一位也会给出不同的签名。
如果您想验证数据完整性,最好使用 CRC32 算法。它比MD5快。尽管可以伪造/修改文件以使其看起来具有正确的 CRC32 签名,但随机损坏位不太可能会这样做。
更新:
这是一个很好的单行代码,可以对每个文件进行 1 兆字节的 md5 校验和:
find ./ -type f -print0 | xargs -0 -n1 -I{} sh -c "echo '{}' >> output.md5 && head -c 1M '{}' | md5sum >> output.md5"
Run Code Online (Sandbox Code Playgroud)
如果您愿意,请将 md5sum 替换为 cksum。请注意,我选择在输出中包含文件名。那是因为当您没有提供整个文件的 md5sum 时,文件名字符串不会被传递。
| 归档时间: |
|
| 查看次数: |
14768 次 |
| 最近记录: |