무작위 파일을 선택하고 각 파티션의 두 파일 모두에서 sha1 해시를 실행하여 두 파티션을 모두 확인합니다.

무작위 파일을 선택하고 각 파티션의 두 파일 모두에서 sha1 해시를 실행하여 두 파티션을 모두 확인합니다.

이전 답변한 기사에서는 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

답변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 /경로/to/fileset1 /path/to/fileset2, 어떤 파일이 다르며 어떤 파일이 어떤 트리에서 누락되었는지 알려줍니다. 감사 목적으로 모든 변경 사항에 대한 자세한 목록을 제공하도록 명령을 확장할 수도 있습니다.diff -rNau /경로/to/fileset1 /path/to/fileset2예를 들어 변경 사항을 저장하려는 위치로 출력을 리디렉션합니다.

관련 정보