• Publicidad

Compara archivos

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

Compara archivos

Notapor haganex » 2012-09-08 18:46 @823

Chicos, recuro a ustedes nuevamente con la siguiente consulta.

Tengo que hacer un programa que por parámetro me llegue algún archivo y éste tengo que compararlo con todos los archivos del sistema y si encuentro alguno que sea igual (contenido y peso) me envíe un print() por pantalla avisando.

He intentado recorrer el directorio y logro hacerlo. El tema es que no entiendo cómo guardar el archivo por parámetro para compararlo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4.  
  5. my $dir_elegido = "/usr/bin";
  6.  
  7. chdir $dir_elegido or die "algo salio mal $! \n";
  8.  
  9. opendir DIR, $dir_elegido or die "no se puede abrir el dir: $! \n";
  10.  
  11. my @archivos = readdir DIR;
  12. foreach my $arch(@archivos)
  13. {
  14.         if(-d $arch)
  15.         {
  16.                 print "$arch es un directorio \n";
  17.                 next;
  18.         }
  19.         if(-l $arch)
  20.         {
  21.                 print"$arch es un enlace simbólico \n";
  22.                 next;
  23.         }
  24.         if(-f $arch)
  25.         {
  26.                 print"$arch es un archivo normal \n";
  27.                 next;
  28.         }
  29.         print "si llegué aquí es porque $arch es algo raro \n";
  30. }
  31.  
  32.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Espero que me puedan ayudar

¡¡ Saludos !!
haganex
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2012-08-25 08:15 @385

Publicidad

Re: Compara archivos

Notapor explorer » 2012-09-08 22:31 @980

Con opendir()/readdir() no estás leyendo más que los archivos del directorio elegido. No estás recorriendo los subdirectorios en profundidad. Para esto, es mejor usar File::Find. Depende de lo que necesites hacer.

Si necesitas comparar por contenido, una opción cómoda es leer a una variable escalar el contenido del archivo a comparar.

Para acelerar el procedimiento, descarta los casos obvios: solo te interesan los archivos normales y además, que tengan el mismo tamaño que el que buscas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     if (-f $arch) {                          # es un fichero normal
  2.         if ($tamano == -s $arch) {           # y del mismo tamaño
  3.             open my $fh, "<$arch" or next;              # vamos a leerlo, si podemos. Si no, al siguiente
  4.             binmode $fh;                                # en modo binario
  5.             read    $fh, my $arch_contenido, $tamano;   # lo leemos
  6.             close   $fh
  7.             if ($contenido eq $arch_contenido) {        # si los contenidos son iguales
  8.                 print "Encontrado igual en $arch\n";    # informamos
  9.             }
  10.         }
  11.     }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Naturalmente, antes hemos leído el archivo primero, de la misma manera, y lo he guardado en $contenido, guardando además su tamaño en $tamano.
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 10 invitados