¡Ya estamos en Twitter!

Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad

Usando File::Find

por Uriel Lizama

Introducción

En este tutorial vamos a aprender a usar un útil módulo que se llama File::Find.

Este tutorial fue creado para hacer búsquedas a través de los directorios de manera rápida y sencilla. Nos facilita el trabajo de gran manera, pues nos evita el trabajo de estar escribiendo grandes códigos para buscar a través de directorios y más si estos tienen muchos subdirectorios.

Una de las grandes ventajas que tiene este módulo es que es multi-plataforma, esto significa que nos servirá tanto en Windows,UNIX,Mac o cualquier otro sistema operativo que estes utilizando.

Las Bases

Básicamente el sintáxis básica que vamos a usar con el módulo es:

use File::Find;

find(\&rutina, (@directorios|$directorio);

Como vemos lo que hacemos es llamar una función que se llama find a la cual envíamos dos argumentos:

  1. El primer argumento es una referencia a una subrutina. Esta subrutina o función la va a ejecutar File::Find con cada archivo y directorio que encuentre.
  2. El segundo argumento, es un arreglo o una cadena con el nombre del directorio que queremos que sea buscado por File::Find. Este directorio lo toma File::Find como la raíz de los directorios, por lo que de ahí empieza a buscar todos los directorios que haya por debajo, sin importar que tan abajo llegue.

Un primer ejemplo

Hagamos un ejemplo rápido y sencillo que nos va a permitir comprender más a fondo como funciona File::Find. Vamos a hacer un pequeño script que imprima los archivos que hay dentro de un arbol de directorios dado:

#!/usr/bin/perl

use strict;
use File::Find;

my $dir = 'C:/Perl/lib/';

find(\&imprimir_archivo, $dir);

sub imprimir_archivo{
my $elemento = $_;
print "$elemento\n" if -f $elemento;
}

Veamos por partes.

Primero llamamos la función find, a la cual como primer argumento enviamos una referencia a la subrutina que llamamos imprimir_archivo y como segundo argumento envíamos la variable $dir que contiene el directorio raíz que queremos buscar.

Al ejecutar esto, File::Find hace una iteración a través de todos los archivos y directorios que encuentra en el directorio raíz, por cada elemento(sea directorio o archivo) llama a la función imprimir_archivo que le mandamos.

En esta subrutina, hicimos algo sencillo, cada elemento es envíado por medio de la variable especial $_, la cual asignamos a una variable la cual llamamos $elemento.

Después hacemos un print, que sólo va a ejecutar en el caso de que $elemento sea un archivo, que los hacemos con el -f de file que pusimos en el if.

Sencillo ¿verdad?, con solo unas cuantas líneas de código, acabamos de hacer un boto que nos va a imprimir todos los archivos que hay en todos los directorios debajo de nuestro directorio raíz.

Agregando más opciones

Pues ya hicimos nuestro script que despliega los archivos, pero nos despliega el archivo y no tenemos idea en que subdirectorio esta.

Para nuestra suerte, los creadores de File::Find pensaron en esto, así que cuando estamos en nuestra función, tenemos dos variables "especiales" que contienen información útil del archivo. Estas variables son:

  • $File::Find::dir Esta variable contiene la ruta del elemento que estamos procesando en el momento.
  • $File::Find::name Esta variable contiene la ruta del elemento que estamos procesando junto con su nombre. Es decir la ruta absoluta del archivo.

Conociendo nuestras variables especiales, simplemente debemos de hacer unos pequeños cambios para que haga lo que nosotros queremos:

#!/usr/bin/perl

use strict;
use File::Find;

my $dir = 'C:/Perl/lib/';

find(\&imprimir_archivo, $dir);

sub imprimir_archivo{
my $elemento = $_;
print "$File::Find::name\n" if -f $elemento;
}

Vemos que sencillo es trabajar con este fabuloso módulo.

Más Posibilidades


Desplegando directorios

Lo hicimos con archivos, pero que tal si solo queremos desplegar los directorios. Para ese caso lo único que tenemos que hacer es cambiar la -f por una -d:

#!/usr/bin/perl

use strict;
use File::Find;

my $dir = 'C:/Perl/lib/';

find(\&imprimir_directorio, $dir);

sub imprimir_directorio{
my $elemento = $_;
print "$File::Find::name\n" if -d $elemento;
}


Archivos que miden menos de 1 kbytes

Digamos que por alguna razón queremos desplegar los archivos que tengan un tamaño menor a 1kb. Usando nuestro fabuloso módulo con unos cuantos cambios lo haríamos de manera muy sencilla:



#!/usr/bin/perl

use strict;
use File::Find;

my $dir = 'C:/Perl/lib/';

find(\&imprimir_archivo_chico, $dir);

sub imprimir_archivo_chico{
my $elemento = $_;
print "$File::Find::name\n" if (-s $elemento < 1024 && -f);
}


Archivos que terminen con .pl

Ahora digamos que queremos desplegar los archivos que terminen con la extensión .pl, lo pensaríamos muy complicado, pero nada de eso:

#!/usr/bin/perl

use strict;
use File::Find;

my $dir = 'C:/Perl/lib/';

find(\&imprimir_archivo_pl, $dir);

sub imprimir_archivo_pl{
my $elemento = $_;

if(-f $elemento && $elemento =~ /\.pl$/){
print "$File::Find::name\n";
}
}


Conclusiones

Cuando tuve que usar este módulo por primera vez para un trabajo que tuve, no tarde más de 5 minutos en convenecerme de que era un módulo fabuloso y muy útil, además de que la sintáxis es sumamente sencilla.

Como siempre les digo, jueguen un poco con el código para que comprendan más como funciona este módulo, usen su imaginación y jueguen...;-)

Pueden ver la documentación completa de este módulo en:

http://search.cpan.org/~nwclark/perl-5.8.5/lib/File/Find.pm
¿Quiéres más tutoriales como este? Escribir tutoriales toma una gran cantidad de tiempo y esfuerzo. Si este tutorial te ayudó a aprender o a solucionar algo, por favor considera dejar alguna donación en apoyo a Perl en Español.

Cliquea en el botón de abajo para dejar tu donación por medio de PayPal.

Comparte:
Categorías de Tutoriales:
En Nuestros Foros:

    Software error:

    junk after document element at line 1, column 32, byte 32 at /usr/lib64/perl5/vendor_perl/XML/Parser.pm line 187.
    

    For help, please send mail to the webmaster ([email protected]), giving this error message and the time and date of the error.

  • Entra a los foros »
Socializa:
Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Perl en Español es mantenido con Movable Type
Todo el contenido de Perl en Español está bajo una licencia CC:
Creative Commons License