Shellでサム値を比較

/ bash

Bashで次のようにハッシュ値を比較する。

function check_sha256sum() {
    file1sum=$(sha256sum "$1" | awk '{print $1}')
    file2sum=$(sha256sum "$2" | awk '{print $1}')
    [[ $file1sum == "$file2sum" ]]
}

これを次のように使える。

if check_sha256sum $filename1 $filename2; then
    echo match hash sum of $filename1 and $filename2
fi

もしくは

if ! check_sha256sum $filename1 $filename2; then
    echo not match hash sum of $filename1 and $filename2
fi

以下おまけ

find "${SSTATE_CACHE_SRC}" -mindepth 2 -name "*.siginfo" -type f | while read -r siginfo_file; do
    sstate_file=${siginfo_file%.siginfo}
    if [[ ! -f $sstate_file ]]; then
        continue
    fi

    sstate_rel=$(realpath --relative-to="$SSTATE_DIR" "$sstate_file")
    if [[ ! -f "$SSTATE_CACHE_DEST/$sstate_rel" || ! -f "$SSTATE_CACHE_DEST/$sstate_rel.siginfo" ]]; then
        mkdir -p "$SSTATE_CACHE_DEST/${sstate_rel%/*}"
        echo "copying $(basename "$sstate_file")"
        cp "$SSTATE_CACHE_SRC/$sstate_rel" "$SSTATE_CACHE_DEST/$sstate_rel"
        cp "$SSTATE_CACHE_SRC/$sstate_rel.siginfo" "$SSTATE_CACHE_DEST/$sstate_rel.siginfo"
    fi

    if [[ $* =~ --clean ]]; then
        if check_sha256sum "$SSTATE_CACHE_SRC/$sstate_rel" "$SSTATE_CACHE_DEST/$sstate_rel"; then
            rm -f "$SSTATE_CACHE_SRC/$sstate_rel"
            rm -f "$SSTATE_CACHE_SRC/$sstate_rel.siginfo"
        fi
    fi
done | head -n10

この使い方は

SSTATE_CACHE_SRC="path/to/somewhere"
SSTATE_CACHE_DEST="path/to/somewhere/else"

SSTATE_CACHE_SRC=${SSTATE_CACHE_SRC%/}
SSTATE_CACHE_DEST=${SSTATE_CACHE_DEST%/}

もしくは外部から

SSTATE_CACHE_SRC="path/to/somewhere" \
SSTATE_CACHE_DEST="path/to/somewhere/else" \
./this_script.sh

として実行する。