获取 bash 上目录的校验和

获取 bash 上目录的校验和

我想知道:

  1. 是否可以创建目录的校验和(使用诸如 md5sum 之类的东西)
  2. 是否可以为目录中的每个文件递归创建校验和(然后打印出来)?
  3. 或两者?

我正在使用 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

相关内容