• Publicidad

Encontrar archivos recientes y copiarlos a otra carpeta

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Encontrar archivos recientes y copiarlos a otra carpeta

Notapor jreyesb » 2009-07-08 20:49 @909

Hola a todos.

Tengo este problema que me está matando, este es el escenario.

Si yo hago esto: ls -l obtengo lo siguiente.

Sintáxis: [ Descargar ] [ Ocultar ]
  1. -rw-r--r--  1 netrac  netrac   2928 jul  8 18:47 file1.pl  
  2. -rw-r--r--  1 netrac  netrac   2928 jul  8 19:07 file2.pl  
  3. -rw-r--r--  1 netrac  netrac   2928 jul  8 19:10 file3.pl 


Ahora bien, lo que necesito solamente son los archivos que fueron accedidos >= 19:00. Por ej.
Sintáxis: [ Descargar ] [ Ocultar ]
  1. -rw-r--r--  1 netrac  netrac   2928 jul  8 19:07 file2.pl  
  2. -rw-r--r--  1 netrac  netrac   2928 jul  8 19:10 file3.pl 


Encontré este script el cual crea una regla para encontrar solamente archivos (y no directorios u otras cosas) que fueron accedidos al menos 14 días antes:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use File::Find::Rule;
my $path = "/data";
my @results = File::Find::Rule->file->ctime('>14')->in($path);
foreach my $i (@results) {
        print "$i\n";
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


La pregunta es, en lugar de 14 días atrás, ¿cómo puedo especificar una fecha? Por ej. >= current system date.

Gracias
Jorge Reyes
Soporte Aplicativo - Iusacell Mexico
jreyesb
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2009-07-08 20:36 @900

Publicidad

Re: Encontrar archivos recientes y copiarlos a otro folder

Notapor explorer » 2009-07-09 06:55 @330

Bienvenido a los foros de Perl en Español, jreyesb.

Se me ocurren dos cosas. La primera es que para saber el tiempo de acceso debes usar atime(), no ctime().

Y la segunda. Depende de en qué formato te den la fecha, pero lo normal sería usar el módulo DateTime para pasar la fecha a días, y de ahí ya puedes usar el módulo de find().
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Encontrar archivos recientes y copiarlos a otro folder

Notapor jreyesb » 2009-07-09 16:56 @747

Hola a todos, gracias Explorer,

Bueno, en realidad esa puede ser una alternativa, digo, la idea sería:

1. Correr el script y copiar todos los ficheros los cuales la fecha de creación sea de los últimos 10 minutos.
2. Cambiar al "folder de trabajo" y parsear los ficheros uno a uno (en este paso, sería bastante útil ordenar los ficheros por ctime)
3. Si los ficheros fueron sorteados, entonces el último archivo parseado contiene el max ctime, así que lo guardo en $lastparsetime
4. Sleep 10 minutos
5. Despierta y busca nuevos ficheros (tomando el $lastparsetime como punto de partida), si existen entonces repite el proceso, si no Sleep otros 10 minutos.

Esto es lo que tengo hasta el momento, pero no está haciendo lo que pretendo arriba, ¿alguna sugerencia, por favor?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use File::Find::Rule;
  3. use Time::Local;
  4.  
  5. my $DIR = "/home/netrac/BSMPERL";
  6. my $DIRW = "/raw_data/COMPLETED/BSM";
  7. my $DIRBIN = "$DIR/bin";
  8. my $DIRLOG = "$DIR/log";
  9. my $DIRDAT = "$DIR/dat";
  10. my $LOGFILE = "$DIRLOG/BSMLog.log";
  11.  
  12. my $target = timelocal( 0, 0, 0, 8, 7, 2009 );
  13. my @results = File::Find::Rule
  14.                 ->file
  15.                 ->name('MCBTSSubsystem-*.gz')
  16.                 ->exec( sub{ (stat($_))[10] - $target > 0 ? $_ : '' } )
  17.                 ->in($DIRW);
  18.  
  19. foreach my $i (@results) {
  20.         print "$i\n";
  21. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Jorge Reyes
Soporte Aplicativo - Iusacell Mexico
jreyesb
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2009-07-08 20:36 @900

Re: Encontrar archivos recientes y copiarlos a otro folder

Notapor explorer » 2009-07-09 18:01 @792

Lo primero que tienes que aclararte es qué tipo de tiempo estamos hablando: creación, acceso o modificación. Cada uno, es distinto. En el primer mensaje del hilo hablabas de acceso, pero en este último hablas de creación.

Vamos a suponer que es el de creación, porque haces tanto referencia a ctime() como a stat[10].

Por ejemplo, con el siguiente código salen los ficheros '/tmp/cache_*' que hayan sido creados en los últimos diez minutos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l
use strict;
use warnings;
use diagnostics;

chdir '/tmp' or die;

for (<cache_*>) {
    my $ctime = (stat($_))[10];

    print if time - $ctime < 10 * 60;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡Ojo! NO salen los ficheros que hayan sido creados hace MÁS de diez minutos.

Lo que hacemos es aplicar las mismas reglas que estás usando con File::Find::Rule, pero de forma más directa: entramos en el directorio, repasamos todos los ficheros que coincidan con el patrón, de cada uno de ellos vemos su tiempo de creación, y miramos a ver si el lapso de tiempo entre la fecha actual (time()) y el de su creación es inferior a 600 segundos.

El problema está justo en cómo indicamos la regla exacta que queremos a File::Find::Rule.

Sabemos que queremos los ficheros creados (ctime()) hace diez minutos (time()-600) o menos, así que lo que queremos son los ficheros cuyos ctime() sean superiores a esa marca (time()-600). Queda así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l
use strict;
use warnings;
use diagnostics;

use File::Find::Rule;

my $path = '/tmp';

my @results = File::Find::Rule->file->ctime('>' . (time - 600))->in($path);

for my $i (@results) {
    my $ctime = (stat $i)[10];
    print "$i $ctime ", time - $ctime;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Fíjate en el truco: hacemos la operación matemática para saber la marca de tiempo de hace diez minutos y luego le ponemos por delante un '>' para que Number::Compare sepa cómo realizar la comparación con el valor de ctime().

Las dos fórmulas que hemos usado son iguales matemáticamente:

time - ctime < 600

ctime > time - 600
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Encontrar archivos recientes y copiarlos a otra carpeta

Notapor jreyesb » 2009-07-10 17:41 @778

Perfecto, explorer, mil gracias, voy a adaptar el código y más tarde posteo la solución que al igual y alguien más resulte interesado.

Excelente foro, de los mejores que he visto, mil gracias.
Jorge Reyes
Soporte Aplicativo - Iusacell Mexico
jreyesb
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2009-07-08 20:36 @900


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 9 invitados