Aprendiendo Perl, el reto: Encontrar duplicados

Marcelo marcelo.magallon en gmail.com
Lun Abr 2 12:45:28 PDT 2012


Tal vez hay que ofrecer algo de material para poder hablar al respecto :-)

Como brian todavía no hay publicado sus comentarios, pongo mi propia
solución que sí es recursiva.  Si le pasan el nombre de un directorio
en la línea de comandos va a buscar duplicados en ese directorio y
todo lo que contenga, sino va a buscarlos en el directorio actual.


#!/usr/bin/env perl

use Modern::Perl '2012';
use Digest::MD5;
use File::Find;

sub get_checksum($)
{
    open my $fh, "<", $_[0] or return undef;
    local $/;
    return Digest::MD5::md5_hex(<$fh>);
}

push @ARGV, '.' unless scalar @ARGV;

my %checksum;

find({
        wanted => sub {
            return if -d $_ || ! -r $_;
            return unless defined (my $key = get_checksum($_));
            if (exists $checksum{$key})
            {
                # Ya vimos otro archivo con el mismo checksum
                say $checksum{$key}, " ", $_;
            }
            else
            {
                $checksum{$key} = $_;
            }
        },
        no_chdir => 1,
    },
    @ARGV);


Más información sobre la lista de distribución Costarica-pm