Hola.
No tengo mucha experiencia en Perl, y necesito crear un programa que busque archivos repetidos.
El programa recibe un directorio como argumento y a partir de ese directorio busque si hay archivos repetidos.
Los archivos repetidos son aquellos que tienen el mismo nombre y mismo tamaño, cuando encuentre archivos repetidos debe listarlos.
Esto es lo que tengo hecho:
#!/usr/bin/perl
use Cwd;
estructura;
# recibe un directorio y construye la estructura
sub construirEstructura {
my $dirOriginal = cwd; # directorio en el que estoy al principio
my $dirTrabajo = shift; # directorio que tengo que recorrer
chdir $dirTrabajo or die "No pude cambiarme al directorio $dirTrabajo : $! \n";
opendir $DIR , '.' or die "No pude abrir el directorio :$! \n";
my @hijos = readdir $DIR or die "No pude leer el directorio : $! \n";
closedir $DIR;
my $suma = 0;
foreach $hijo (@hijos) {
# para esto vamos a omitir los directorios '.', '..' y los links
next if ($hijo eq '.');
next if ($hijo eq '..');
next if (-l $hijo);
# primero el caso de los archivos normales:
if (-f $hijo){
# ruta donde esta el archivo
my $ruta = cwd;
# metemos el dato en la estructura
push(@{$estructura{$hijo}}, $ruta);
}
# luego los directorios:
if (-d $hijo){
# recorremos recursivamente los directorios.
construirEstructura ($hijo);
}
}
# volver al directorio inicial:
chdir $dirOriginal or die "No pude volver al directorio anterior : $! \n";
}
# codigo de llamada del comando:
my $num_argumentos = $#ARGV + 1;
if ($num_argumentos == 0){
construirEstructura '.';
}
if ($num_argumentos == 1){
my $directorio = shift @ARGV;
construirEstructura $directorio;
}
if ($num_argumentos > 1){
print "uso : listaRepetidos.pl directorio\n";
exit;
}
# mostramos la estructura por pantalla
foreach my $nombre_archivo (keys %estructura) {
print "El archivo $nombre_archivo esta en: \n";
# recuperamos una lista con las rutas de los archivos.
@arreglo_rutas = @{$estructura{$nombre_archivo}};
foreach $ruta(@arreglo_rutas) {
print "\t$ruta\n";
}
print "\tNumero de Repeticiones ". @arreglo_rutas. "\n";
}
Lo que me falta es cómo comparar las claves del hash para saber si hay repetidos y eso unirlo a calcular el tamaño de cada archivo.
Ojalá me puedan ayudar.