Página 1 de 2

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

NotaPublicado: 2015-05-05 12:56 @581
por enric73
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

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

NotaPublicado: 2015-05-05 13:53 @620
por explorer
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.

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

NotaPublicado: 2015-05-05 14:01 @626
por enric73
Hola, explorer. A la fecha de creación.

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

NotaPublicado: 2015-05-05 14:32 @647
por explorer
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

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

NotaPublicado: 2015-05-05 16:54 @745
por enric73
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

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

NotaPublicado: 2015-05-06 05:32 @272
por explorer
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

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

NotaPublicado: 2015-05-06 10:06 @463
por enric73
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.

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

NotaPublicado: 2015-05-06 10:39 @485
por explorer
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 ;)

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

NotaPublicado: 2015-05-06 11:12 @508
por enric73
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

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

NotaPublicado: 2015-05-07 17:08 @755
por enric73
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.001 segundos, usando GeSHi 1.0.8.4