Shell-Script

通過選擇隨機文件並在每個分區的兩個文件上執行 sha1 雜湊來檢查兩個分區

  • September 28, 2014

先前對文章的回答提到在 dd 驅動器複製映像的映像上執行 sha1 雜湊。

該文章的另一個答案建議安裝 dd 圖像,然後比較“重要文件”的 sha1 雜湊是否匹配。

我想使用第二種方法,但不是手動選擇文件,而是我想使用一堆隨機選擇的文件。

假設我有兩個已掛載的分區,我可以選擇一堆隨機文件並比較 sha1 散列,如果散列不相等則停止並出現錯誤?

如果一切順利,輸出應該與此大致相似:

好的:所有 10000 個隨機選擇的文件都有匹配的 sha1 和分區 sda 和 sdb

或者輸出應該只在出現錯誤的情況下顯示在兩個分區上具有不同 sha1 總和的文件名。

目前程式碼正在進行中:

#!/bin/bash

N=5
mydir="/home"

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

據我了解您的問題,您想知道兩個文件系統路徑之間的 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

請注意,此腳本假定您的所有文件名都不包含換行符。

引用自:https://unix.stackexchange.com/questions/157894