通过选择随机文件并对每个分区的两个文件运行 sha1 哈希来检查两个分区

通过选择随机文件并对每个分区的两个文件运行 sha1 哈希来检查两个分区

A之前的回答一篇文章提到对 dd 驱动器克隆映像的映像运行 sha1 哈希。

其他回复那个帖子建议安装 dd 映像,然后比较“重要文件”的 sha1 哈希值是否匹配。

我想使用第二种方法,但我不想手动选择文件,而是想使用一堆随机选择的文件。

假设我有两个已安装的分区,我可以选择一堆随机文件并比较 sha1 哈希值,如果哈希值不相等则停止并显示错误吗?

如果一切顺利的话,输出应该与此大致相似:

好的:所有 10000 个随机选择的文件都具有与分区 sda 和 sdb 匹配的 sha1 和

或者输出应该仅在出现错误时显示,并显示两个分区上具有不同 sha1 总和的文件名。

当前正在进行的代码:

#!/bin/bash

N=5
mydir="/home"

dirlisting=`find $mydir |sort -R |tail -$N`
for fname in $dirlisting
do
    echo $fname
done

答案1

据我了解您的问题,您想找出两个文件系统路径之间的 N 个随机文件是否不同。比较文件应该比计算两个文件的校验和更快。您可以这样做:

#!/bin/sh
list1=/tmp/list1
list2=/tmp/list2
shuflist=/tmp/shuflist
n=100000 # How many files to compare.
if test ! -d "$1" -o ! -d "$2"; then
    echo "Usage: $0 path1 path2"
    exit 1
fi
exitcode=0
(cd "$1" && find . -type f >"$list1") || exit 1
(cd "$2" && find . -type f >"$list2") || exit 1
if cmp -s "$list1" "$list2"; then
    shuf -n "$n" "$list1" > "$shuflist"
    while IFS= read -r filename; do
        if ! cmp -s "$1/$filename" "$2/$filename"; then
            echo "Files '$1/$filename' and '$2/$filename' differ."
            exitcode=1
            break
        fi
    done < "$shuflist"
else
    echo File lists differ.
    exitcode=1
fi
rm "$list1" "$list2" "$shuflist"
exit $exitcode

请注意,此脚本假定您的文件名都不包含换行符。

答案2

如果你想比较两个目录的文件和子目录,那么差异命令可以为你做到这一点。通过跑步diff -rq /路径/到/文件集1 /路径/到/文件集2,它会告诉您哪些文件不同以及哪棵树缺少哪些文件。您甚至可以扩展该命令,给出所有更改的详细列表以用于审核目的diff -rNau /路径/到/文件集1 /路径/到/文件集2例如,并将输出重定向到您想要存储更改的位置。

相关内容