Práctica: Descenso Recursivo en Subdirectorios

Usando el módulo File::Find escriba un programa que muestre los ficheros en el directorio actual mayores que un cierto tamaño dado y cuyo tiempo de modificación es mayor que un cierto número de días.

File::Find

El módulo File::Find provee la función find. La sintáxis es:

      find(\&wanted,  @directories);

find() hace un recorrido primero profundo de los directorios especificados en @directories. Para cada fichero o directorio encontrado se llama a la subrutina &wanted. Además, para cada directorio que se encuentre se cambia chdir() al directorio y se continúa la búsqueda, invocando a la función &wanted.

La función wanted es lo que se denomina un callback (Callback_(computer_science). En ella el programador escribe lo que quiere hacer con el fichero o directorio: imprimirlo, renombrarlo, borrarlo, etc. La función será llamada sin argumentos y su valor de retorno será ignorado.

Cuando se la llama:

Estas variables son automáticamente localizadas por find.

Veamos un ejemplo de uso:

lhp@europa:~/Lperl/src/perltesting/structinline$ perl -wde 0
main::(-e:1):   0
DB<1> !!tree -sD '.'
.
|-- [       4096 Feb 13  8:18]  _Inline
|   |-- [       4096 Feb 13  8:18]  build
|   |-- [        390 Feb 13  8:18]  config
|   `-- [       4096 Feb 13  8:18]  lib
|       `-- [       4096 Feb 13  8:18]  auto
|           `-- [       4096 Feb 13  8:18]  example_pl_7eb7
|               |-- [          0 Feb 13  8:18]  example_pl_7eb7.bs
|               |-- [        584 Feb 13  8:18]  example_pl_7eb7.inl
|               `-- [      30969 Feb 13  8:18]  example_pl_7eb7.so
|-- [        778 Feb 13  8:18]  all.t
|-- [        758 Feb 13  8:18]  anon.t
`-- [        750 Feb 13  8:18]  example.pl

5 directories, 7 files
DB<2> use File::Find
DB<3> sub callback { return unless -f $_; push @large, $File::Find::name if -s $_ > 30000 }
DB<4> find(\&callback, '.')
DB<5> x @large
0  './_Inline/lib/auto/example_pl_7eb7/example_pl_7eb7.so'
1  './_Inline/lib/auto/example_pl_7eb7/.svn/text-base/example_pl_7eb7.so.svn-base'
El ejemplo encuentra un fichero adicional al mostrado por tree que se encuentra en un directorio escondido (.svn).

Referencias

La función find espera como primer argumento una referencia a una subrutina. El operador Perl \ actúa de manera similar al ampersand en C: nos devuelve una referencia al objeto al que se le aplica. Por ejemplo:

$ra = \$a;  # referencia a escalar
$rb = \@b;  # referencia a arreglo
$rc = \%c;  # referencia a hash
$rf = \&f;  # referencia a subrutina
$rx = \$rb; # referencia a referencia

Getopt::Long

Utilice Getopt::Long para leer las opciones en la línea de comandos. Deberá admitir las llamadas:

grandes -s size -m dias directorios
grandes -v -s  size -m dias directorios # modo verbose
grandes -h                              # ayuda
grandes -V                              # version, autor

En modo verbose el programa informa de cada directorio que está procesando.

Pod::Usage

Use Pod::Usage para escribir la ayuda.

Por ejemplo, la llamada:

pod2usage( -verbose => 1,);
hace que se muestren las secciones SYNOPSIS así como cualesquiera secciones (esto es, definidas con =head1) tituladas OPTIONS, ARGUMENTS, o OPTIONS AND ARGUMENTS.

Véase también



Subsecciones
Casiano Rodríguez León
2009-10-04