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.
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:
$File::Find::dir es el directorio actual
$_ contiene el nombre del fichero actual
$File::Find::name es el nombre completo del fichero
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).
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
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.
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.
lhp@nereida:~/Lperl/src$ perl -wde 0
main::(-e:1): 0
DB<1> use File::Find::Rule
DB<2> @subdirs = File::Find::Rule->directory->name('perl*')->in('.')
DB<3> p 0+@subdirs
7
DB<4> @progs = File::Find::Rule->file->name('*.pl')->size('>10Ki')->in('.')
DB<5> p 0+@progs
27
DB<6> x $progs[0]
0 'kpad.pl'
DB<7> !!ls -l kpad.pl
-rwxr-xr-x 1 lhp lhp 12881 2006-06-15 12:52 kpad.pl