• Publicidad

Obtener fechas de un fichero y compararlas

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Obtener fechas de un fichero y compararlas

Notapor erjuak » 2015-09-23 12:48 @575

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.
erjuak
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2013-03-07 11:52 @536

Publicidad

Re: Obtener fechas de un fichero y compararlas

Notapor explorer » 2015-09-23 13:06 @588

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener fechas de un fichero y compararlas

Notapor erjuak » 2015-09-23 14:13 @634

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.002 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.
erjuak
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2013-03-07 11:52 @536

Re: Obtener fechas de un fichero y compararlas

Notapor explorer » 2015-09-23 18:42 @821

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

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