バイナリファイル同士を比較したいけどcmpが無かったので頑張った話

id:eel3:20130826:1377522419 と似たようなパターンのネタ。

相変わらずbusyboxな組込みLinux環境で作業していて、バイナリファイルを比較しようとしたらcmp(1)が無かった。dirname(1)に引き続き2度目……。

組み込んであるbusyboxのdiffがバイナリファイルに対応しているか分からなかったので、その場は比較対象のファイルをcksum(1)*1にかけてチェックサムを比較する方法で逃げた。

また同じような事態が発生した時のことを考えて、後でシェルスクリプト化してみた。

#!/bin/sh

readonly SUMCMD=md5sum

progname=`basename $0`

if [ $# -ne 2 ]; then
    echo "usage: $progname file1 file2" 1>&2
    echo 'dirty hack cmp - substutute of cmp(1)' 1>&2
    exit 2
fi
for i; do
    if [ ! -f "$i" ]; then
        echo "$progname: $i: Invalid argument" 1>&2
        exit 2
    fi
done

f1sum=`$SUMCMD "$1" | cut -d " " -f 1`
f2sum=`$SUMCMD "$2" | cut -d " " -f 1`
if [ "$f1sum" != "$f2sum" ]; then
    echo "$@" "Not equal" 1>&2
    exit 1
fi

exit 0

単純に一致/不一致を調べるだけならこれで十分なはず。ハッシュの衝突が起きない限り……マシンパワーとの兼ね合いもあるけど、md5sum(1)あたりを使っていればハッシュの衝突なんてまず起きないだろう(理論的には可能性はあるけど)。

*1:後でmd5sum(1)が組み込まれていたことに気づき、cksum(1)から変更した。