コピーしたファイル群のハッシュ値を比較する

ファイル群をコピーした際に、正常にコピーされたか確かめたいことがある。そういう場合に使えるコマンドをメモしておく。

まず、find コマンドで再帰的に shasum を実行する。結果はファイルに保存しつつ、標準出力にも出す(進行状況をわかりやすくするため)。

$ find . -exec shasum -a 256 '{}' \; | tee file-list.txt

コピー元とコピー先で同様のコマンドを実行し、それぞれハッシュ値一覧のファイルを作る。

find の列挙順はよくわからない(Macの find コマンドは -s で辞書順にソートできるようだ)。コピー元とコピー先で列挙の順番が違うかもしれないので、sort したい。shasum の出力は先にハッシュ値が来て、後にファイル名が来る。sort コマンドに -k オプションを使うと、ファイル名の部分でソートできる。

$ sort -k2 < file-list-src.txt > file-list-src-sorted.txt
$ sort -k2 < file-list-dst.txt > file-list-dst-sorted.txt

あとは diff で比較する。

$ diff file-list-src-sorted.txt file-list-dst-sorted.txt

シェルによっては、ソートと diff をワンライナーで

$ diff <(sort -k2 file-list-src.txt) <(sort -k2 file-list-dst.txt)

と書けるかもしれない(bashとzshではできそう)。

diff で比較する以外に、shasum -c でチェックする方法もあるかもしれない。その辺は好みで。