[Linux] MD5の値を大量にチェックする

小ネタです。 例えばsplitコマンドなどで分割したファイルをダウンロードした際に、一つ一つMD5の値を確認するのはダルいですよね。md5sumコマンドでは、予め検証したいファイルのパスとそのMD5の値をペアで記述されたファイルを用意しておくと、一発で確認することでができます。

定義ファイルは以下のようにMD5値と、ファイルのパスを半角スペースなどで区切って書きます。

$ cat MD5SUM
f64062373f79e3fdabed57f6aec6d54d data/foo.zip.1
89063c79371e866afe627ddc221d3a9e data/foo.zip.2
993e1252af0e1fbd2435dcadd2a9fead data/foo.zip.3

あとは-cオプションでこの定義ファイルを渡せば自動的にチェックしてくれます。

$ md5sum -c MD5SUM
data/foo.zip.1: OK
data/foo.zip.2: OK
data/foo.zip.3: OK

エラーパターン

エラーになる場合は次のような表示になります。

ファイルが存在しない。

md5sum: stat 'data/bar.zip': No such file or directory

MD5チェックサムの値が異なる。

data/foo.zip.2: FAILED

定義ファイルにかかれているMD5チェックサムの長さが異なる。以下は1byte分削除した際のメッセージ。こちらはエラーではなく警告、そのため処理は続行されます。

Warning: Hash size is wrong, maybe you want to use 'sha1sum' or 'ripemd160sum'

BASHで結果をチェック

シェルスクリプトでmd5チェックサムの結果がすべて正しかった場合にのみ処理を継続したい場合は、以下のように記述します。

#!/bin/bash

if md5sum -c MD5SUM | grep -Ev 'OK$' > /dev/null; then
  echo '[ERROR] 正常に保存されていないファイルがあります'
  exit 1
else
  echo 'OK'
fi

grepコマンドでOKではない行が存在すればエラーというお手軽ロジックです。