とあるディレクトリにある重複ファイルを消す。

個人的につくったシステムでDBのバックアップを定期的にあるディレクトリに吐いているのだが、そんなに頻繁にデータが更新されるわけではないので、まったく同じ(Identical)ファイルがバックアップフォルダに並ぶことになるのだ。

なんとなくディスクが無駄である。
そこで、同階層にある重複ファイルは削除するプログラムをPerlで作った。

MD5はコストがかかるのだ、とある。が、それを改良した

のFile::Find::IdenticalというモジュールもCPANにあがってそうでないので、MD5で比較することにしました。別にコストといっても気になるレベルじゃないしー。

#!/usr/bin/perl

use strict;
use warnings;
use Digest::MD5;

my $dir = $ARGV[0] || die "$0 dir";

opendir my $dh, $dir or die "Cannot opendir: $dir";
my %hash = ();

for my $f ( sort grep !/^\./, readdir($dh) ) {
    my $filepath = "$dir/$f";

    next unless -f $filepath;

    open my $fh, "<", $filepath or die;
    my $md5 = Digest::MD5->new->addfile($fh)->hexdigest;
    close $fh or die;

    if (exists $hash{$md5}) {
        unlink $filepath;
        print "unlink $filepath";
    } else {
        $hash{$md5} = $filepath;
        print "not unlink $filepath";
    }
    print "\n";
}

closedir $dh;

exit;

とりあえず動いています。Md5コリジョンとか発生しても責任とりませんでw。