ディレクトリを再帰的に辿ってファイルのダイジェストを生成

ディレクトリのコピーが正常終了したかどうかを、ファイルのダイジェストを元に確認したかった。 コマンドの組み立てに、いくらかの調べものと試行錯誤をしたので、メモしておく、 結果的に、コマンドは以下に落ち着いた。

$ find -type f -print0 | sort -z | xargs -0 sha1sum

ハッシュ関数

ハッシュ関数はsha1sumを利用した。 md5sumでもsha256sumでもよかったが、sha256sumだと実行時間が体感でsha1sumの倍ぐらいあったということで、sha1sumにしておいた。

執筆時点で、ファイル破損の検出にどのハッシュ関数を使うのがスタンダードなのかはよく分からない。 参考までに、CentOSダウンロードサイトではsha1sumとsha256sumの計算結果がアップロードされていた。 また、Ubuntuダウンロードサイトではmd5sum、sha1sum、sha256sumの計算結果がアップロードされていた。

セパレータ

xargsで空白および記号を含むファイル名を正しく取り扱えるように、データ(ここではファイルのパス)の区切りを空白や改行ではなく、NUL (\0)にする。 パイプによる連結を想定しているコマンドは、セパレータをNULにするオプションを備えているものが多いように思う。 ここで利用しているコマンドとオプションは以下。

コマンド オプション
find -print0
sort -z
xargs -0