Página 1 de 1

Obtener fechas de un fichero y compararlas

NotaPublicado: 2015-09-23 12:48 @575
por erjuak
Hola.

De un directorio dado, ¿cómo podría sacar el fichero más reciente? Y una vez que lo tuviera localizado, me gustaría comparar dicho fichero con la fecha actual de forma que si el fichero tiene fecha de ayer, reconocerlo como antiguo, y si tiene fecha de hoy, pues reconocerlo que está al día.

¿Alguien me podría dar una pista?

Muchas gracias y un saludo.

Re: Obtener fechas de un fichero y compararlas

NotaPublicado: 2015-09-23 13:06 @588
por explorer
Con los operadores -X (escribir perldoc -f -X) puedes ver qué archivos son los que han superado una determinada fecha. O usarlos dentro de un sort() para tener la lista de archivos ordenada por fecha (de última modificación).

Mira estos hilos a ver si te ayudan.

Re: Obtener fechas de un fichero y compararlas

NotaPublicado: 2015-09-23 14:13 @634
por erjuak
Hola, explorer, gracias por contestar.

Pero bueno, no entiendo muy bien eso de usar el operador -X. ¿Dónde lo uso? Estoy un poco perdido...

Viendo los hilos que me has pasado, hay un código muy interesante, el cual es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. perl -le 'opendir DIR, "."; while($fichero = readdir DIR) { print $fichero if -f $fichero and -M _ < 1 }'
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Pero lo que entiendo, te saca por pantalla los ficheros más nuevos que tenga menos de un día, pero... ¿y si los ficheros los más nuevos, tienen más de 3 días?
Estoy un poco perdido...

Gracias de nuevo, explorer.

Re: Obtener fechas de un fichero y compararlas

NotaPublicado: 2015-09-23 18:42 @821
por explorer
Por eso te decía que consultaras la documentación: perldoc -f -X es la forma de sacar la documentación Perl sobre los operadores -X. Te lo copio aquí:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    -X IDENTIFICADOR_ARCHIVO
    -X EXPR
    -X IDENTIFICADOR_DIR
    -X  Un test de archivo, donde X es una de las letras listadas abajo. Este
        operador unario toma un argumento, bien sea un nombre de archivo o un
        identificador de archivo o de directorio, y comprueba si el archivo
        asociado para ver si algo sobre él es cierto. Si el argumento se
        omite, se prueba $_, excepto para "-t", que prueba STDIN. Mientras no
        se diga lo contrario, se devuelve 1 para verdadero y '' para falso. Si
        el archivo no existe o no puede examinarse, devuelve "undef" y
        actualiza $! (errno). A pesar de los nombres graciosos, la precedencia
        es la misma que cualquier otro operador unario con nombre. El operador
        puede ser cualquiera de estos:

            -r  Archivo es legible por el uid/gid en vigor.
            -w  Archivo es escribible por el uid/gid en vigor.
            -x  Archivo es ejecutable por el uid/gid en vigor.
            -o  Archivo es propiedad del uid en vigor.

            -R  Archivo es legible por el uid/gid real.
            -W  Archivo es escribible por el uid/gid real.
            -X  Archivo es ejecutable por el uid/gid real.
            -O  Archivo es propiedad del uid real.

            -e  Archivo existe.
            -z  Archivo tiene tamaño cero (está vacío).
            -s  Archivo no tiene tamaño cero (devuelve el tamaño en bytes).

            -f  Archivo es un archivo normal.
            -d  Archivo es un directorio.
            -l  Archivo es un enlace simbólico.
            -p  Archivo es una tubería con nombre (FIFO), o el identificador de archivo es una tubería.
            -S  Archivo es un socket.
            -b  Archivo es un archivo especial por bloques.
            -c  Archivo es un archivo especial de caracteres.
            -t  El identificador está abierto a una tty.

            -u  Archivo tiene puesto el bit setuid.
            -g  Archivo tiene puesto el bit setgid.
            -k  Archivo tiene puesto el bit sticky.

            -T  Archivo es un archivo de texto ASCII (por una suposición heurística).
            -B  archivo es un archivo "binario" (opuesto de -T).

            -M  Tiempo de arranque del script menos el tiempo de modificación del archivo, en días.
            -A  Lo mismo, para el tiempo de acceso.
            -C  Lo mismo, para el cambio de la fecha del inodo (en Unix, puede diferir en otras
                plataformas)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
(el resto está en perldoc perlfunc)
En tu caso, te interesan los operadores '-M' (tiempo de modificación) o '-C' (tiempo de creación, en algunas plataformas). Con el '-M', te vale la mayor parte de las veces.

Entonces, si quieres saber si un determino archivo tiene más de tres días, vale con poner
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use feature 'say';
  2.  
  3. for $nombre_archivo (<*.txt>) {         # recorremos todos los archivos
  4.     if (-M $nombre_archivo > 3) {
  5.         say "El archivo $nombre_archivo tiene más de 3 días";
  6.     }
  7. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Como lo que quieres es quedarte, primero, con el archivo más reciente, primero hay que obtener la lista de todos los archivos, ordenados por fecha de modificación:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @archivos = sort { -M $a <=> -M $b } <*.txt>;        # de la lista de archivos *.txt,
  2.                                                         # los ordenamos numéricamente (<=>), de menor a mayor
  3. if (-M $archivos[0] > 3) {                              # el primer archivo es el más actual. Vemos si tiene más de 3 días
  4.     say "El archivo $nombre_archivo tiene más de 3 días";
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Entonces, "-M $archivo > 3" quiere decir que la condición es verdadera si la fecha de modificación del $archivo, en días, con respecto al momento de la ejecución del programa, es mayor que 3.

Como el programa lo ejecutamos "ahora", pues entonces "-M $archivo > 3" es, efectivamente, 3 días de antigüedad.