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例如,并将输出重定向到您想要存储更改的位置。