Linux: md5sumでチェックサムを比較する

md5sum等でチェックサムファイルを作成しておくことで、リモートサーバへコピーしたファイルの整合性を確認することができるようになります。例えば、scpコマンドはコピー先ファイルの整合性を保障していません(rsyncコマンドはコピー時にチェックサムを計算しているので本手順は不要です)。この記事ではmd5sumでチェックサムを比較する手順を記載します。

1 ファイルのチェックサムを比較する

ファイルを指定してチェックサムをmd5ファイルに保存します。

$ md5sum file.txt | tee file.md5
9af2f8218b150c351ad802c6f3d66abe  file.txt

file.txtとfile.md5をリモートサーバに送信します。

$ scp file.txt file.md5 <server>:<path>

リモートサーバにて、file.txtを格納したディレクトリにてfile.md5を-cオプションで指定します。チェックサムが一致した場合は戻り値が0になります。

$ md5sum -c file.md5
file.txt: OK
$ echo $?
0

チェックサムが一致しなかった場合やファイルが存在しない場合は、戻り値が0でない値になります。

$ md5sum -c file.md5
file.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
$ echo $?
1

2 ディレクトリ内の全ファイルのチェックサムを比較する

以下のようなディレクトリを用います。

$ tree dir
dir
├── file1.txt
└── subdir
    └── file2.txt

全ファイルのチェックサムを比較するには全ファイルをmd5sumで指定する必要があります。findコマンドを使うことで全ファイルの指定を省略できます。

$ cd dir
$ md5sum $(find . -type f) | tee ../dir.md5
3d709e89c8ce201e3c928eb917989aef  ./subdir/file2.txt
5149d403009a139c7e085405ef762e1a  ./file1.txt

dirとdir.md5を別サーバに送信します。

$ scp -r dir dir.md5 <server>:<path>

リモートサーバにて、dir内でdir.md5を-cオプションで指定します。全てのチェックサムが一致した場合は戻り値が0になります。

$ cd dir
$ md5sum -c ../dir.md5
./subdir/file2.txt: OK
./file1.txt: OK
$ echo $?
0

チェックサムが一致しなかったり存在しないファイルがある場合は、戻り値が0でない値になります。

$ cd dir
$ md5sum -c ../dir.md5
./subdir/file2.txt: FAILED
./file1.txt: OK
md5sum: WARNING: 1 computed checksum did NOT match
$ echo $?
1