• Publicidad

Buscar archivos repetidos en un directorio

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Buscar archivos repetidos en un directorio

Notapor claudiita » 2012-06-05 23:16 @011

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.
claudiita
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2012-06-05 23:06 @004

Publicidad

Re: Buscar archivos repetidos en un directorio

Notapor explorer » 2012-06-06 06:11 @299

Bienvenida a los foros de Perl en Español, claudiita.

Algunos comentarios...
  • Para sacar una estructura compleja de datos, una forma rápida es usando el módulo Data::Dumper:
    Sintáxis: [ Descargar ] [ Ocultar ]
    Using perl Syntax Highlighting
    1. use Data::Dumper;
    2. print Dumper(\%estructura);
    Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
  • Veo que guardas, en un hash cuyas claves son los nombres de los archivos, un array con las rutas en las que se encuentra. Si el problema es listar coincidencias de nombre y tamaño, quizás no sea necesario guardar las rutas
  • Para saber el tamaño de un archivo, se suele usar el operador '-s'. Ejemplo: $size = -s $archivo;
  • Una vez construido el hash, puedes recorrer las claves con la función keys(). Luego, por cada clave, saca el array con las rutas. Si solo hay una, no estaba repetido. Si hay más de una, debes hacer un bucle por todas ellas para ver los tamaños, y sacar tantas líneas como números que se repiten.

Cuidado, que puede haber un problema... podría existir un archivo que apareciera cuatro veces, y tuviera dos tamaños distintos (dos archivos son iguales a otros dos), con lo que entonces, debería salir dos veces, ¿no?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 30 invitados