#!/usr/bin/perl # finddupes - find duplicate files by MD5 digest # use strict; use warnings; use File::Find; use Digest::MD5; my %FilesBySize; # default: current directory @ARGV = qw/./ unless @ARGV; # find all files find ({wanted => \&add_file, no_chdir => 1}, @ARGV); find_duplicates(); exit 0; ########################################### sub add_file {    return unless -f $_;    my $size = -s _;    return unless $size;    push @{$FilesBySize{$size}}, $File::Find::name; } sub find_duplicates {    for my $s (sort {$a <=> $b} keys %FilesBySize) {        next unless @{$FilesBySize{$s}} > 1; # more than 1 file?        my %md5s = ();        for my $f (@{$FilesBySize{$s}}) {            my $md5 = calc_md5 ($f);            push @{$md5s{$md5}}, $f;        }        for my $md5 (keys %md5s) {            if (@{$md5s{$md5}} > 1) {                print "Identische MD5-Summe (mit $s Bytes): \n";                print "\t$_\n" for @{$md5s{$md5}};            }        }    } } sub calc_md5 {    my $file = shift;    open(FILE, $file) or warn "can't open '$file': $!\n";    binmode(FILE);    my $md5 = Digest::MD5->new;    while () {        $md5->add($_);    }    close(FILE);    return $md5->b64digest; }