Estoy leyendo elmanual de coreutils de gnu, y estoy experimentando con el date
comando. Esto es lo que encontré en el texto:
El
date
comando tiene una opción:-f datefile
- Analiza cada línea enarchivo de fechacomo con
-d
y muestra la fecha y hora resultantes. - eso significa
date
mirar cada línea enarchivo de fecha y tratarlo como una cadena de fecha para usar para mostrar una fecha en particular.
- Analiza cada línea enarchivo de fechacomo con
EnCapítulo 29 (Formatos de entrada de fecha), se afirma:
La salida del
date
comando no siempre es aceptable como cadena de fecha, no sólo por el problema del idioma, sino también porque no existe un significado estándar para elementos de zona horaria como 'IST'. Cuando se utilizadate
para generar una cadena de fecha destinada a ser analizada más tarde, especifique un formato de fecha que sea independiente del idioma y que no utilice elementos de zona horaria distintos de 'UTC' y 'Z'. A continuación se muestran algunas formas de hacer esto:$ LC_ALL=C TZ=UTC0 date ︙
- Esta afirmación (especialmente la parte en negrita) implica para mí que debería poder poner en archivo de fechaun
date
comando como el anterior, y eldate
comando que emito en la terminal debería poder analizar esedate
comando en elarchivo de fecha y generar la fecha correspondiente.
- Esta afirmación (especialmente la parte en negrita) implica para mí que debería poder poner en archivo de fechaun
No está funcionando para mí. O hay algún problema con mi comando de fecha en el archivo de fecha (comillas incorrectas, alguna sintaxis especial que no conozco...), o la -f datefile
opción no es capaz de manejar esta situación.
Lo que pregunto, en resumen, es:
date -f
¿Se puede alimentar el comando con un archivo donde la cadena de fecha en una línea sea otro comando de fecha? por ejemplo, ¿puedo poner en un archivo una cadena "fecha" en la primera línea (que, como comando, devolvería la hora del sistema), y luego introducir ese archivo en undate -f
comando y obtener la hora actual del sistema (generada por eldate
comando en el archivo)?
Respuesta1
El formato correcto para una fecha y hora que la fecha GNU analizará correctamente es:
$ LC_ALL=C TZ=UTC0 date +"%Y-%m-%dT%H:%M:%S%z"
2016-09-28T04:08:55+0000
Y eso evita espacios también, que pueden generar otros problemas.
Si su archivo contiene una línea por fecha como:
$ cat dates.txt
1992-03-28T14:26:01+0000
2004-02-29T21:02:02+0000
2005-02-28T21:02:03+0000
2015-07-02T11:52:04+0000
2016-03-31T01:36:05+0000
Entonces esto funcionará:
$ TZ=America/Los_Angeles date -f infile
Sat Mar 28 06:26:01 PST 1992
Sun Feb 29 13:02:02 PST 2004
Mon Feb 28 13:02:03 PST 2005
Thu Jul 2 04:52:04 PDT 2015
Wed Mar 30 18:36:05 PDT 2016
Si lo que quieres hacer es crear un archivo con "comandos de fecha" como en:
$ cat dates.txt
date -d "1992-03-28T14:26:01+0000"
date -d "2004-02-29T21:02:02+0000"
LC_ALL=C TZ=UTC0 date -d "2005-02-28T21:02:03+0000" +"%Y-%m-%d"
TZ=America/Los_Angeles date -d "2005-02-28T21:02:03+0000"
date -d "2015-07-02T11:52:04+0000"
date -d "2016-03-31T01:36:05+0000"
Luego necesitas ejecutar cada línea con el shell.
Una solución rápida es obtener el archivo y se ejecutarán todos los comandos.
$ . ./dates.txt
Sat Mar 28 14:26:01 GMT 1992
Sun Feb 29 21:02:02 GMT 2004
2005-02-28
Mon Feb 28 13:02:03 PST 2005
Thu Jul 2 11:52:04 GMT 2015
Thu Mar 31 01:36:05 GMT 2016
¿Esto responde a tu pregunta?
Respuesta2
Con date
coreutils 8.21, TZ=UTC y LC_ALL=CI obtienen
$ date > x; sleep 1; date >> x; sleep 1; date >> x
$ date -f x
Wed Sep 28 03:32:39 UTC 2016
Wed Sep 28 03:32:40 UTC 2016
Wed Sep 28 03:32:41 UTC 2016
$
como se esperaba. También revisé el código fuente: la magia ocurre en la rutina batch_convert
donde esencialmente hay un bucle sobre parse_datetime()
/ show_date()
tal como en el caso de la línea de comando (usando -d
).
Respuesta3
No, no puedes leer LC_ALL=C TZ=UTC0
un archivo con date -f
.
cat tz
LC_ALL=C TZ=UTC0
date -f tz
date: invalid date ”LC_ALL=C TZ=UTC0”
Sin embargo, puedes poner el comando completo en un archivo, como este:
cat date
#!/bin/bash
LC_ALL=C TZ=UTC0 date
Luego ejecútelo desde la línea de comando, que le dará:
./date
Tue Sep 27 06:56:29 UTC 2016
A diferencia de la zona horaria de mi servidor, que es:
date
tis 27 sep 2016 08:56:52 CEST