我想知道:
- 是否可以创建目录的校验和(使用诸如 md5sum 之类的东西)
- 是否可以为目录中的每个文件递归创建校验和(然后打印出来)?
- 或两者?
我正在使用 bash
答案1
md5sum
但是,不会将目录作为输入
tar cf - FOO | md5sum
将对它进行校验和,如果文件在 FOO 中的任何位置发生更改,校验和都会更改,但您不会有任何关于哪个文件的提示。如果任何文件元数据发生变化(权限、时间戳等),校验和也会发生变化。
您可以考虑使用:
find FOO -type f -exec md5sum {} \; > FOO.md5
它将单独对每个文件进行 md5,并将结果保存在 FOO.md5 中。这样可以更轻松地检查哪个文件已更改。此变体仅取决于文件内容,而不取决于元数据。
答案2
ZFS 创建这样的校验和,但这仅供内部使用。
为了计算对象的校验和,您需要读取该对象,而对于目录来说,这是不可能的。
许多文件系统在尝试读取(2)目录时返回 EISDIR 错误,并且 ZFS 另外将目录的“大小”设置为该目录中的条目数而不是字节数(当您希望读取(2)目录)。
事实上,某些文件系统仍然允许您读取 (2) 目录,这是一个错误 - 这是 20 世纪 70 年代没有 readdir() 调用时留下的产物。
顺便说一句:在我的 WOFS 上,所有目录的大小都是 0,因为它们没有任何文件类型内容,因为这些文件在其元数据中表示“嘿,我在这个目录中”。如果您想知道 WOFS 是什么:WOFS 的所有其他基本概念都已合并到 ZFS 中。
答案3
1.为什么目录需要md5sum?如果您想确保文件的一致性和/或完整性,您可以将其压缩并制作tar
/tar.gz
文件的哈希值。
2.如果你有子目录,那就有点困难了。如果您只有文件,请尝试以下示例:
#!/bin/bash
for i in /home/{username}/Books/rhel/; do
md5sum "$i"
done
输出示例:
dd7a684cc8668d208ca5dcf00bc58e8d Red_Hat_Enterprise_Linux-6-Deployment...
775602071a1ec5a1ac1a99cee9d065fa Red_Hat_Enterprise_Linux-7-High_Av..
答案4
在https://blake2.net/他们声称:
“ BLAKE2 是一个加密哈希函数快点比 MD5、SHA-1、SHA-2 和 SHA-3 更好,但至少一样安全最新标准SHA-3。 BLAKE2因其高速、安全、简单而被许多项目采用。 ”
因此,一些工具正在使用它,例如 rmlinthttps://github.com/sahib/rmlint。
无论如何,跟随https://unix.stackexchange.com/a/228758/9689,你还可以这样做:
find "${dirname}"/ -type f -exec b2sum -b -l 256 {} \; > "${dirname}".blake2sum_l256
然后检查:
b2sum -c "${dirname}".blake2sum_l256
或者这样只查看失败的:
b2sum --quiet -c "${dirname}".blake2sum_l256