年末だし、ハードディスクの中の重複したファイルを見つけて、削除してしまおう。

対象とするファイル

  • ファイルサイズが大きめ
  • 不完全なファイルも存在する
  • ディレクトリ階層を再帰的に検索

そのため、先頭1MB を対象としたハッシュ比較により、ファイルの同一性を検出します。

スクリプト

~/test.sh
#!/bin/sh

cp /dev/null /tmp/list0.txt
find . -type f -exec dd if={} bs=1024 count=1000 of=/tmp/work.bin \; -exec md5sum /tmp/work.bin >> /tmp/list0.txt \; -exec du {} >> /tmp/list0.txt \;
sed ':loop; N; $!b loop; ;s/\/tmp\/work.bin\n//g' /tmp/list0.txt > /tmp/list1.txt
sort /tmp/list1.txt | uniq -D -w 32 > /tmp/list2.txt
rm /tmp/work.bin /tmp/list0.txt

スクリプトの実行

$ cd /PATH/TO/TARGET
$ time ~/test.sh

実行結果

出力されるファイル 内容
/tmp/list1.txt ハッシュとサイズとパス
/tmp/list2.txt 重複しているファイルの一覧

ファイルの削除

ファイルのサイズとディレクトリを参照して冗長なファイルを削除します。