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:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
my $directorio = "/home/explorer/Documentos/Desarrollo/test"; # directorio en el que se va a buscar
if ( @ARGV <= 0 ) {
die "Uso: $0 <archivo a buscar>\n";
}
my $archivo_a_buscar = "$directorio/$ARGV[0]";
if (! -f $archivo_a_buscar) {
die "ERROR: No encuentro ese archivo\n";
}
my $peso_archivo = -s $archivo_a_buscar;
$archivo_a_buscar = $ARGV[0]; # nos quedamos solo con el nombre del archivo
print " Buscando [$archivo_a_buscar] de peso [$peso_archivo] en [$directorio]\n";
my @encontrados;
buscar( $directorio );
sub buscar {
my $directorio = shift;
opendir DIR, $directorio or die "ERROR: Algo salio mal: $!\n";
my @archivos = readdir(DIR);
closedir DIR;
for my $archivo (@archivos) {
next if $archivo eq '.';
next if $archivo eq '..';
my $file = "$directorio/$archivo";
if ( -f $file) {
my @info = stat $file;
print "\t$file => $info[7]\n";
if ( $archivo eq $archivo_a_buscar and $peso_archivo == -s $file) {
push @encontrados, $file; # cada vez que se encuentra un archivo, este es agregado al arreglo
next;
}
}
elsif (-d $file) {
buscar( $file );
}
}
}
print " Se han encontrado ", scalar(@encontrados), " coincidencias\n";
for my $archivo (@encontrados) {
my @info = stat $archivo;
print "Peso: $info[7]\t$archivo\n";
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Esto es lo que sale:
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.