O comando date pode usar como argumento uma string de data em um arquivo dado por outro comando date?

1

Estou lendo o manual do GNU Core Utils e estou experimentando o comando date. Aqui está o que eu encontrei no texto:

  1. O comando

    date tem uma opção -f datefile :

    • Analise cada linha no arquivo de datas como com -d e exiba a data e a hora resultantes
    • significa que a data está olhando para cada linha do arquivo de data e tratando-a como uma string de data para ser usada para exibir essa data específica.
  2. No capítulo 28 (Formatos de entrada de data), é indicado:

The output of the date command is not always acceptable as a date string, not only because of the language problem, but also because there is no standard meaning for time zone items like ‘IST’. When using date to generate a date string intended to be parsed later, specify a date format that is independent of language and that does not use time zone items other than ‘UTC’ and ‘Z’. Here are some ways to do this:

$ LC_ALL=C TZ=UTC0 date

Mon Mar 1 00:21:42 UTC 2004

  • esta declaração (especialmente a parte em negrito) implica para mim que eu deveria ser capaz de colocar no arquivo de datas um comando de data como o acima e o comando de data que eu emite no terminal deve ser capaz de analisar esse comando de data o datefile e a saída da data correspondente.

Por alguma razão, não está funcionando para mim. Há algo errado com o meu comando de data no arquivo de datas (aspas erradas, alguma sintaxe especial que eu não conheço ....), ou a opção -f datefile não é capaz de lidar com essa situação.

O que eu estou perguntando em resumo é:

  • o comando date -f pode ser alimentado com um arquivo em que a string de data em uma linha é outro comando de data? por exemplo. posso colocar em um arquivo uma string "date" na primeira linha (que como um comando retornaria a hora do sistema), e então alimentar esse arquivo em um comando date -f e obter a hora atual do sistema (gerada pelo comando date no arquivo)?

Muito obrigado

Andrei

    
por Andrei Costache 27.09.2016 / 08:32

3 respostas

0

O formato correto para uma data-hora que será analisada corretamente pela data GNU é:

$ LC_ALL=C TZ=UTC0 date +"%Y-%m-%dT%H:%M:%S%z"
2016-09-28T04:08:55+0000

E isso evita espaços também, o que pode gerar outros problemas.

Se o seu arquivo contiver uma linha por data, 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

Então isso 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

Se o que você deseja fazer é criar um arquivo com "comandos de data", como em:

$ 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"

Então você precisa executar cada linha com o shell.
Uma solução rápida é a fonte do arquivo e todos os comandos serão executados.

$ . ./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

Isso responde à sua pergunta?

    
por 28.09.2016 / 06:19
0

Não, você não pode ler LC_ALL=C TZ=UTC0 de um arquivo com date -f .

cat tz
LC_ALL=C TZ=UTC0

date -f tz
date: invalid date ”LC_ALL=C TZ=UTC0”

Você pode, no entanto, colocar o comando inteiro em um arquivo, como este:

cat date
#!/bin/bash

LC_ALL=C TZ=UTC0 date

Em seguida, execute-o a partir da linha de comando, o que lhe dá:

./date 
Tue Sep 27 06:56:29 UTC 2016

Ao contrário do fuso horário no meu servidor, que é:

date
tis 27 sep 2016 08:56:52 CEST
    
por 27.09.2016 / 08:58
0

Com date dos coreutils 8.21, TZ = UTC e LC_ALL = C eu obtenho

$ 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 esperado. Eu verifiquei o código-fonte também: A mágica acontece na rotina batch_convert , onde essencialmente há um loop sobre parse_datetime() / show_date() , assim como no caso da linha de comando (usando -d ).

    
por 28.09.2016 / 05:36

Tags