如何比较两个包含多个 md5 校验和的文件以确定是否更改的文件?

如何比较两个包含多个 md5 校验和的文件以确定是否更改的文件?

我有两个文件MD1MD2

MD1包含 md5sum:

5f31caf675f2542a971582442a6625f6  /root/md5filescreator/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30  /root/md5filescreator/hash2.txt
1364cdba38ec62d7b711319ff60dea01  /root/md5filescreator/hash3.txt

其中hash1hash2hash3是文件夹中的三个文件md5filescreator

同样MD2包含:

163559001ec29c4bbbbe96344373760a  /root/md5filescreators/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30  /root/md5filescreators/hash2.txt
1364cdba38ec62d7b711319ff60dea01  /root/md5filescreators/hash3.txt

这些文件位于文件夹中md5filescreators

我想将 中的校验md5filescreator和与 中相应文件的校验和进行比较md5filecreators

shell 脚本应该返回好的对于具有相同校验和的文件和错误的对于那些不存在的文件,则附上文件名。

可以使用以下方法完成此操作吗md5sum --check(因为它通常只检查 1 个 MD5 文件中是否有任何更改)?

答案1

我想知道这是否可以使用来完成md5sum --check(因为它通常只检查 1 个 MD5 文件中的任何更改)。

不可以。

md5sum --check旨在读取输入文件第二列中每个文件的路径,并根据第一列报告的校验和检查它们的 MD5 校验和;如果您想直接比较两个文件中的校验和,则必须比较文本文件。

使用paste+ AWK 你可以执行以下操作:

paste file1 file2 | awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}'
  • paste file1 file2:连接第 N 行file1和第 N 行file2
  • awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}':如果第一个字段等于第三个字段(即 MD5 总和匹配),则将 "OK" 分配给x,否则将 "FALSE" 分配给x并打印第二个字段(即文件名)后跟 的值x
% cat file1
5f31caf675f2542a971582442a6625f6 /root/md5filescreator/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30 /root/md5filescreator/hash2.txt
1364cdba38ec62d7b711319ff60dea01 /root/md5filescreator/hash3.txt
% cat file2
163559001ec29c4bbbbe96344373760a /root/md5filescreators/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30 /root/md5filescreators/hash2.txt
1364cdba38ec62d7b711319ff60dea01 /root/md5filescreators/hash3.txt
% paste file1 file2 | awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}'
/root/md5filescreator/hash1.txt FALSE
/root/md5filescreator/hash2.txt OK
/root/md5filescreator/hash3.txt OK

答案2

一个简单的检查方法是看看哪些行是不是两个文件均有重复:

sort file1 file2 | uniq --unique

uniq --unique打印那些没有再次出现的行。因此,哈希值匹配的文件将具有重复的行,并且不会出现在输出中。要简单测试是否产生任何输出,请使用grep

sort file1 file2 | uniq --unique | grep -q .

在这种情况下,由于目录不同,需要进行更多处理:

awk -F/ '{print $1, $NF}' | sort | uniq --unique | awk '!a[$2]++{print $2}'

或者,完全在 awk 中:

awk -F/ 'FNR == NR {hash[$NF] = $1; next} hash[$NF] != $1 {print $NF}'

在这两种情况下,您只会获得哈希值不同的文件名。

相关内容