それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

コマンドで重複ファイルを探す。

重複ファイルを探すコマンド

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個以下でコリジョンする可能性は低いのではないでしょうか。

参考資料

https://unix.stackexchange.com/questions/277697/whats-the-quickest-way-to-find-duplicated-files/277767