[caracas-pm-list] Re: [l-linux] Busqueda con find

Ernesto Hernandez-Novich emhn at telcel.net.ve
Wed Jan 21 07:05:00 CST 2004


On Tue, 20 Jan 2004, Luis Roa P. wrote:
> En realidad no estoy seguro si con find puedo hacer lo que necesito.
>
> A partir de un determinado path, necesito ubicar archivos cuyo nombre
> obedece a un patron comun,

Si el patrón es expresable con metacaracteres del shell puedes usar find
directamente; es decir, si puedes escribir un 'ls <patrón>' que te
entregue los nombres de archivo, entonces el mismo patrón te va a
funcionar con find.

> y de esos, _solo_ recuperar los nombres de aquellos que tienen mas de "n"
> dias para borrarlos, sin tocar los que no cumplen ese requisito.

"Más de n días" se puede interpretar de varias formas:
- Días desde que fueron creados (Creation Time o ctime).
- Días desde que fueron modificados (Modification Time, mtime).
- Días desde que fueron accedidos (Access Time, atime).
En los ejemplos asumiré lo último, que es lo más frecuente.

Las cláusulas de find se verifican de izquierda a derecha, de modo que

find <raíz> -name <patrón> -atime +n -exec rm {} \;

primero verifica que coincida el nombre, luego la cantidad de tiempo
desde el último acceso y finalmente lo borra.

> Me es igual si es shell o perl, mientras pueda incluirlo en un script que
> debe correr en cron.

Si el patrón no es expresable con metacaracteres del shell, find no
puede ayudarte, y entonces podrías utilizar Perl con su módulo
File::Find.

#!/usr/bin/perl

use File::Find;

find( \&condiciones, qw(/var /foo) );

sub condiciones {
  my $file = $File::Find::name;
  my $dias = 7;

  $file =~ /patrón/ && int (-M $file) > $dias && unlink($file);
}

...que se puede escribir de forma más compacta como

#!/usr/bin/perl
use File::Find;
find ( sub { /patron/ && int (-A) > 7 && unlink }, qw(/var /foo))

Perl con el módulo find _siempre_ es más rápido que find; de hecho,
existe find2perl para traducir comandos find a su equivalente en Perl
(muy útil para aprender técnicas de programación en Perl :-)
-- 
Ernesto Hernández-Novich - On Linux 2.6.0 i686 - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't apt-get it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3
------------------------------------------------------------------------
Enviar e-mail a <majordomo at pm.org> colocando en el cuerpo:
"UNSUBSCRIBE caracas-pm-list" para desuscribirse.
"INFO caracas-pm-list" para conocer las reglas de etiqueta.
------------------------------------------------------------------------



More information about the caracas-pm mailing list