• Publicidad

Eliminar carpetas con una antigüedad de más de 12 horas

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

Eliminar carpetas con una antigüedad de más de 12 horas

Notapor enric73 » 2015-05-05 12:56 @581

Hola,

necesito eliminar carpetas que tengan una antigüedad de más de 12 horas.

El siguiente código está incompleto porque necesito la fecha de creación de cada carpeta y no lo consigo. ¿Me pueden echar un cable?

De momento el código queda de esta manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use v5.10.0;                                      
  4. use File::Copy;
  5. use POSIX 'strftime';
  6. use File::Temp;
  7. use File::stat;
  8.  
  9.  
  10.  
  11. my $dir    = '/home/sim/data/';
  12. opendir(DIR,"$dir");
  13. @files = readdir(DIR);
  14. foreach $file (@files){
  15. print $file, "\n";
  16. if (-C $file > 0.5){
  17. unlink $file;
  18. }
  19. }
  20. closedir(DIR)
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por enric73 el 2015-05-06 01:26 @101, editado 2 veces en total
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Publicidad

Re: Eliminar carpetas con una antigüedad de más de 12 horas

Notapor explorer » 2015-05-05 13:53 @620

Cuando te refieres a antigüedad, ¿exactamente con respecto a qué? ¿Desde el momento en que se creó la carpeta o desde la fecha de la última modificación que se le hizo a esa carpeta? Son cosas muy distintas.

Por ejemplo, en Linux tu puedes crear una carpeta hoy, y tendrá fecha de creación de hoy mismo, pero cada vez que ocurra un cambio dentro de ella (se haga un cambio en alguno de los archivos/carpetas que contiene) se actualiza su fecha de última modificación.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar carpetas con una antigüedad de más de 12 horas

Notapor enric73 » 2015-05-05 14:01 @626

Hola, explorer. A la fecha de creación.
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Eliminar carpetas con una antigüedad de más de 12 horas

Notapor explorer » 2015-05-05 14:32 @647

Como veo que estás en Unix/Linux, puedes usar la función stat(). En los índices 8, 9 y 10 obtienes los valores de tiempo (último acceso, última modificación y último cambio de inodo -normalmente, creación-).

Yo, casi siempre, he usado el operador -M, ya que te devuelve la diferencia, en días, desde que arranca el programa a la fecha de la última modificación del archivo (entonces, de forma efectiva, si el programa lo arrancamos ahora, -M devuelve el tiempo efectivo, en días, de la última modificación del archivo).

En tu caso, como lo que quieres es hacerlo con respecto a la creación, puedes usar el operador -C. Esta es la más cómoda y rápida.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if (-C $archivo > 0.5) {
    # ...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
0.5 corresponde a 12 horas con respecto al momento en que arrancamos el programa (o sea, ahora mismo :) )

Más información en perldoc -f -X y perldoc -f stat
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar carpetas con una antigüedad de más de 12 horas

Notapor enric73 » 2015-05-05 16:54 @745

He introducido un par de líneas en el código, pero no elimina las carpetas "viejas"

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use v5.10.0;                                      
  2. use File::Copy;
  3. use POSIX 'strftime';
  4. use File::Temp;
  5. use File::stat;
  6.  
  7. my $dir    = '/home/sim/data/';
  8. opendir(DIR,"$dir");
  9. @files = readdir(DIR);
  10. foreach $file (@files){
  11. print $file, "\n";
  12. if (-C $file > 0.5){
  13. unlink $file;
  14. }
  15. }
  16. closedir(DIR)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Eliminar carpetas con una antigüedad de más de 12 horas

Notapor explorer » 2015-05-06 05:32 @272

unlink() elimina archivos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    unlink LISTA
    unlink
        Elimina una lista de archivos. En caso de éxito, devuelve el número de
        archivos que se han eliminado correctamente. En caso de error, se
        devuelve falso y establece $! (errno):
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Si quieres eliminar carpetas debes usar rmdir():
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    rmdir
        Elimina el directorio especificado por NOMBRE_DIRECTORIO si ese
        directorio está vacío. Si tiene éxito devuelve verdadero; en caso
        contrario devuelve falso y asigna $! (errno). Si se omite
        NOMBRE_DIRECTORIO, utiliza $_.

        Para eliminar un árbol de directorio recursivamente ("rm -rf" en Unix)
        mire la función "rmtree" del módulo File::Path.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Por otra parte, ten mucho cuidado: Entre los resultados que devuelve readdir() se encuentra el propio directorio en donde te encuentras ('.') y el directorio padre en donde te encuentras ('..'). Y no creo que quieras probar a borrarlos :) Usa un next para saltarlos, en la comprobación:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     next if $file =~ /^[.]/;    # salta al siguiente si se trata de un archivo oculto o el directorio actual o el padre
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar carpetas con una antigüedad de más de 12 horas

Notapor enric73 » 2015-05-06 10:06 @463

explorer, gracias. Lo comprobaré más tarde. Ayer me cargué algún directorio. :shock: de todo se aprende.

Leo en la definición de rmdir
Elimina el directorio especificado por NOMBRE_DIRECTORIO si ese
directorio está vacío

¿Y si el directorio está lleno de ficheros? Quiero eliminar el directorio y también los ficheros de dentro.
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Eliminar carpetas con una antigüedad de más de 12 horas

Notapor explorer » 2015-05-06 10:39 @485

Yo siempre hago pruebas con programas que borran cosas :D Cambio unlink y rmdir por print. Así sé qué es lo que va a desaparecer antes de que desaparezca.

Sobre rmdir, termina de leer lo que te puse ;)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar carpetas con una antigüedad de más de 12 horas

Notapor enric73 » 2015-05-06 11:12 @508

Je,je. Dejé de leer la última parte. Entonces será

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. rmtree ($file) or die $!;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Eliminar carpetas con una antigüedad de más de 12 horas

Notapor enric73 » 2015-05-07 17:08 @755

Hola, explorer. Algo del siguiente código no me permite borrar carpetas más viejas de 12 horas.

Aparece un aviso: "Use of uninitialized value in numeric gt (>) at ./clean.pl line 25. (en la parte if (-C $file > 0.5))

¿Alguna idea?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     use v5.10.0;
  2.     use File::Copy;
  3.     use POSIX 'strftime';
  4.     use File::Temp;
  5.     use File::stat;
  6.  
  7.     my $dir = '/home/sim/data/';
  8.     opendir( DIR, "$dir" );
  9.     @files = readdir(DIR);
  10.     foreach $file (@files) {
  11.         print $file, "\n";
  12.         next if $file =~ /^[.]/;    # salta al siguiente si se trata de un archivo oculto o el directorio actual o el padre
  13.         {
  14.             if ( -C $file > 0.5 ) {
  15.                 rmtree($file) or die $!;
  16.             }
  17.         }
  18.     }
  19.     closedir(DIR)
  20.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron