• Publicidad

Borrar archivos

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

Borrar archivos

Notapor Vans » 2007-07-30 14:34 @648

Hola, tengo un pequeño problema.

Necesito eliminar archivos (respaldo que se generan diario) de cierto directorio, éstos están guardados con el formato aaaa.mm.dd; solo se necesita dejar los archivos de los 10 últimos días; la operación de los últimos 10 días ya la tengo, es la siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l
use strict;
use POSIX qw[strftime];
my $respaldo = strftime('%Y-%m-%d', localtime(time - 864000));
print "Hace 10 dias: $respaldo\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Lo que no sé es cómo compararlo con los archivos.
Vans
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2007-07-30 14:22 @640

Publicidad

Notapor explorer » 2007-07-30 15:41 @695

Bienvenido a los foros de Perl en Español.

Podrías hacer una comparación de las fechas, a nivel de días desde el epoch, desde luego. Para saber el tiempo de última modificación del fichero se usa la función stat(), que devuelve información de un fichero.

Algo así: con time() tenemos la fecha actual en días. Y con (stat($fichero))[9] tenemos, en días desde el epoch, la fecha de última modificación del $fichero. La diferencia nos da cuánto tiempo tiene de vida el $fichero: (time-(stat($fichero))[9]) / 86_400.

Pero... eso es algo muy complicado para algo que se puede realizar usando solo un operador: el -M: diferencia, en días, de tiempo entre la fecha de modificación del fichero y el arranque del programa.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

# Entramos en el dir. de respaldo y lo abrimos
chdir '/tmp'     or die "ERROR: No puedo entrar en dir de respaldo: $!\n";
opendir DIR, '.' or die "ERROR: No puedo abrir el dir de respaldo: $!\n";

while( my $fichero = readdir DIR ) {       # Leemos el directorio, fichero por fichero

    next if                                       # Saltamos al siguiente si
            !-f $fichero                          #   no es un fichero normal
         or $fichero !~ /^\d{4}\.\d{2}\.\d{2}$/   # o no corresponde a nuestro patrón
         or -M $fichero < 11;                     # o no es lo suficientemente viejo

    print "Borrando $fichero\n";

    unlink $fichero;                              # Lo borramos
}

closedir DIR;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Fíjate que se ha añadido las comprobaciones de patrón y de ser un simple fichero. A la hora de borrar cosas, toda precaución es poca (Guía del Administrador Paranoico).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2007-07-30 16:16 @719

Como addendum, decir que ese tipo de borrados es tan normal, que se puede hacer de forma mucho más cómoda con otras herramientas, como el poderoso find:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
find /tmp -name '[0-9][0-9][0-9][0-9].[0-9][0-9].[0-9][0-9]' -type f -mtime +10 -exec rm {} \;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Incluso si estamos seguros que en /tmp (nuestro directorio de respaldo de ejemplo) sólo va a contener ficheros de respaldo, podemos quitar la parte de -name, con lo que queda más corto todavía.

En las primeras pruebas, cambia 'rm' por 'echo', para asegurarte de que vas a borrar correctamente (Guía del Administrador Paranoico).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Gracias

Notapor Vans » 2007-07-31 10:04 @461

Muchas gracias por contestar mi pregunta, ya quedó resuelto, nuevamente gracias.
Vans
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2007-07-30 14:22 @640

Notapor Kiloko » 2007-09-10 10:46 @490

explorer escribiste:Como addendum, decir que ese tipo de borrados es tan normal, que se puede hacer de forma mucho más cómoda con otras herramientas, como el poderoso find:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
find /tmp -name '[0-9][0-9][0-9][0-9].[0-9][0-9].[0-9][0-9]' -type f -mtime +10 -exec rm {} \;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Incluso si estamos seguros que en /tmp (nuestro directorio de respaldo de ejemplo) sólo va a contener ficheros de respaldo, podemos quitar la parte de -name, con lo que queda más corto todavía.

En las primeras pruebas, cambia 'rm' por 'echo', para asegurarte de que vas a borrar correctamente (Guía del Administrador Paranoico).


Me parece muy interesante la forma que describes para poder realizar la eliminación de los archivos, eliminando incluso el tener que escribir código y supongo que una instrucción como la que mencionas sería introducida en cron, para poder ser ejecutada X número de veces.

Mi duda recae en la forma que utilizas para identificar que los valores son posteriores a un mes. He de suponer que es en la parte
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
'[0-9][0-9][0-9][0-9].[0-9][0-9].[0-9][0-9]'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Quiero entender que utilizas cuatro valores de 0-9 para identificar el año (2007) de 4 dígitos y así subsecuentemente con el mes (05) antes de separarlos por un punto.

Quisiera saber si estoy en lo correcto y si es así, ¿cómo es que funciona 0-9 para saber que es de un mes antes?

Saludos
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL

Notapor explorer » 2007-09-10 11:33 @522

El conjunto de pares '[0-9]' sirven para filtrar por los nombres de los ficheros (cuatro dígitos, un punto, dos dígitos, un punto, dos dígitos).

La opción que indica que queremos que, además, esos ficheros tengan más de 10 días de antigüedad, es la de '-mtime +10', que quiere decir que buscamos que el fichero tenga más de 10*24 horas de tiempo de modificación con respecto al momento en que ejecutamos el 'find'.

Más info, en la página de manual de find.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Kiloko » 2007-09-10 15:05 @670

Enterado busco mas info. en find. Gracias.
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL


Volver a Básico

¿Quién está conectado?

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