重複ファイルを探すコマンド
find . -type f -exec md5sum {} + | sort | uniq -w32 -dD
find して md5sum にかけて sort したら、uniq を取る
解説
コマンドがズラッと並ぶのでひとつずつ見ていく
現在のディレクトリ以下のエントリ(Dir/File)を列挙
find .
現在のディレクトリ以下のファイルを列挙
find . -type f
現在のディレクトリ以下のファイルを探し、それぞれに md5sum コマンドを実行する
find . -type f -exec md5sum {} +
結果をアルファベット順にソートする(uniq は実行前にソートが必要です)
find . -type f -exec md5sum {} + | sort
uniq で重複している行を探す。ただし行頭から32文字が一致したら同一とみなす
uniq -w32
重複している行を全て表示する
uniq -w32 -dD
このコマンドのコツ
uniq -w32
がポイントです。
find -exec md5sum の実行結果は次のようになります。
d41d8cd98f00b204e9800998ecf8427e ./2018-07-19/fileA e171a382b037094552b57633061ee8b0 ./2018-05-31/fileB e171a382b037094552b57633061ee8b0 ./2018-05-31/fileC
とfind の結果が並ぶのです。ここから各行の「先頭 32 文字」は md5sum の計算結果です。
ここから、cut (awk)して join してもいいのですが。
md5sum_outout | awk '{ print $1 } ' | uniq -d > dups join dups md5sum_outout
ファイルを作ってしまうのが美しくない。
uniq のオプション
行の比較を最初のN文字で比較する物を使います。
-w, --check-chars=N 行の比較を最初の N 文字で行う
これを使うと、md5sum の結果の一覧を -w32 と書くことで 32バイトのmd5sum の結果をもれなくダブリを探せるわけです。
uniq のその他のオプション
-d, --repeated 重複した行のみ出力する。出力はグループ毎に 1 回行われる -D 重複する行を全て出力する
md5sum でいいの?
十分だと思います。ファイル数がせいぜい1M個以下でコリジョンする可能性は低いのではないでしょうか。