• Publicidad

Buscar archivo repetidos sin usar find

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

Buscar archivo repetidos sin usar find

Notapor Camilein » 2012-09-26 14:16 @636

Hola a todos, estoy aprendiendo Perl y me han dado una tarea en la que tengo que, usando una función recursiva, recorrer un directorio, encontrar las repeticiones de un archivo (nombre del archivo ingresado por parámetro) que coincida tanto en nombre como en peso. Pero el detalle es que no puedo usar Find, y para el peso debo usar -s.

He tratado y tratado. He creado archivos con mismo nombre pero diferente tamaño, pero mi código me los muestra todos como si tuvieran el mismo peso.

Les agradecería mucho su ayuda. Espero haber sido claro
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use Cwd;
  5. my $directorio = "/home/camilo";       #directorio en el que se va a buscar
  6. if ( @ARGV > 0 ) {
  7.     buscar( $directorio, @ARGV );
  8. }
  9. else {
  10.     print "No se han ingresado argumentos\n";
  11. }
  12.  
  13. our ( $contador1, $contador2, @Encontrados, $pesoBuscado );    #variables quedan declaradas como globales
  14.  
  15. sub buscar {
  16.     my $directorio     = shift;
  17.     my $archivoBuscado = shift;
  18.     $pesoBuscado = -s ($archivoBuscado);
  19.     opendir DIR, $directorio or die("Algo salio mal: $!");
  20.     my @archivos = readdir(DIR);
  21.     closedir DIR;
  22.  
  23.     foreach my $archivo (@archivos) {
  24.  
  25.         next if ( $archivo eq '.' );
  26.         next if ( $archivo eq '..' );
  27.  
  28.         if ( -f $archivo ) {
  29.             my @info = stat($archivo);
  30.             print "$directorio/$archivo----@info[7]\n";
  31.  
  32.             if ( ( $archivo eq $archivoBuscado ) ) {
  33.                 $contador1++;
  34.  
  35.                 push( @Encontrados, $archivo );    #cada vez qe se encuentra un archivo, este es agregado al arreglo
  36.                 next;
  37.  
  38.             }
  39.         }
  40.  
  41.         if ( -d "$directorio/$archivo" ) {
  42.             buscar( "$directorio/$archivo", $archivoBuscado );
  43.             next;
  44.         }
  45.     }
  46.  
  47. }
  48. print " Se han encontrado $contador1 coincidencias\n";
  49.  
  50. while ( @Encontrados > 0 ) {
  51.     my $encontrado = pop(@Encontrados);
  52.     my @info       = stat($encontrado);
  53.     print "Peso: @info[7]\n";
  54.  
  55. }
  56.  
  57. print "Se han encontrado $contador2 coincidencias del archivo \n";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-09-26 15:16 @677, editado 1 vez en total
Razón: Formateado de código con Perltidy
Camilein
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-09-26 14:07 @630

Publicidad

Re: Buscar archivo repetidos sin usar find

Notapor explorer » 2012-09-26 16:39 @735

Bienvenido a los foros de Perl en Español, Camilein

El problema está en las líneas 28 a 38.

$archivo contiene el nombre del archivo, desde luego, pero en la línea 28 estás intentando averiguar si es un archivo normal (y no un directorio), y aquí empiezan los problemas: -f requiere que se le dé la ruta completa al archivo, de la misma manera que lo tienes en la línea 41. Y claro, eso puede funcionar en la primera profundidad del directorios, pero no en las demás, ya que -f no será capaz de encontrar al archivo.

Y lo mismo se puede decir de la línea 29.

Una cosa: no necesitas pasar como segundo argumento el archivo a buscar, si siempre es el mismo. Mejor lo averiguas antes, al igual que su peso.

Esta es mi versión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3.  
  4. my $directorio = "/home/explorer/Documentos/Desarrollo/test";           # directorio en el que se va a buscar
  5.  
  6. if ( @ARGV <= 0 ) {
  7.     die "Uso: $0 <archivo a buscar>\n";
  8. }
  9.  
  10. my $archivo_a_buscar = "$directorio/$ARGV[0]";
  11.  
  12. if (! -f $archivo_a_buscar) {
  13.     die "ERROR: No encuentro ese archivo\n";
  14. }
  15.  
  16. my $peso_archivo = -s $archivo_a_buscar;
  17.  
  18. $archivo_a_buscar = $ARGV[0];           # nos quedamos solo con el nombre del archivo
  19.  
  20. print " Buscando [$archivo_a_buscar] de peso [$peso_archivo] en [$directorio]\n";
  21.  
  22. my @encontrados;
  23.  
  24. buscar( $directorio );
  25.  
  26. sub buscar {
  27.     my $directorio = shift;
  28.  
  29.     opendir DIR, $directorio or die "ERROR: Algo salio mal: $!\n";
  30.     my @archivos = readdir(DIR);
  31.     closedir DIR;
  32.  
  33.     for my $archivo (@archivos) {
  34.  
  35.         next if $archivo eq '.';
  36.         next if $archivo eq '..';
  37.  
  38.         my $file = "$directorio/$archivo";
  39.  
  40.         if ( -f  $file) {
  41.             my @info = stat $file;
  42.             print "\t$file => $info[7]\n";
  43.  
  44.             if ( $archivo eq $archivo_a_buscar  and  $peso_archivo == -s $file) {
  45.                 push @encontrados, $file;       # cada vez que se encuentra un archivo, este es agregado al arreglo
  46.                 next;
  47.             }
  48.         }  
  49.         elsif (-d $file) {
  50.             buscar( $file );
  51.         }
  52.     }
  53. }
  54.  
  55. print " Se han encontrado ", scalar(@encontrados), " coincidencias\n";
  56.  
  57. for my $archivo (@encontrados) {
  58.     my @info = stat $archivo;
  59.     print "Peso: $info[7]\t$archivo\n";
  60. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Esto es lo que sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@joaquinferrero:~/Documentos/Desarrollo> perl code_32446.pl test.pl
 Buscando [test.pl] de peso [2434] en [/home/explorer/Documentos/Desarrollo/test]
        /home/explorer/Documentos/Desarrollo/test/test.pl~ => 2308
        /home/explorer/Documentos/Desarrollo/test/.project => 361
        /home/explorer/Documentos/Desarrollo/test/test1/test.pl => 0
        /home/explorer/Documentos/Desarrollo/test/test1/test2/test.pl => 2434
        /home/explorer/Documentos/Desarrollo/test/test.pl => 2434
 Se han encontrado 2 coincidencias
Peso: 2434      /home/explorer/Documentos/Desarrollo/test/test1/test2/test.pl
Peso: 2434      /home/explorer/Documentos/Desarrollo/test/test.pl
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Cuidado cuando saques un valor de @info. No es '@info[7]', sino '$info[7]'. Más información en perldata y perldsc.
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

Re: Buscar archivo repetidos sin usar find

Notapor Camilein » 2012-09-27 17:19 @763

Un millón de gracias, ha funcionado más que bien. Ahora además de que me ha quedado bien claro en qué me estaba equivocando.

Saludos
Camilein
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-09-26 14:07 @630


Volver a Básico

¿Quién está conectado?

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