Estou lendo oManual do GNU coreutilse estou experimentando o date
comando. Aqui está o que encontrei no texto:
O
date
comando tem uma opção:-f datefile
- Analise cada linha emarquivo de datacomo acontece com
-d
e exibir a data e hora resultantes. - isso significa
date
que é olhar para cada linha emarquivo de data e tratá-lo como uma string de data para uso para exibir uma data específica.
- Analise cada linha emarquivo de datacomo acontece com
Emcapítulo 29 (Formatos de entrada de data), afirma-se:
A saída do
date
comando nem sempre é aceitável como uma sequência de datas, não apenas por causa do problema de idioma, mas também porque não existe um significado padrão para itens de fuso horário como 'IST'. Ao usardate
para gerar uma sequência de datas destinada a ser analisada posteriormente, especifique um formato de data que seja independente do idioma e que não use itens de fuso horário diferentes de 'UTC' e 'Z'. Aqui estão algumas maneiras de fazer isso:$ LC_ALL=C TZ=UTC0 date ︙
- esta afirmação (especialmente a parte em negrito) implica para mim que eu deveria ser capaz de colocar no arquivo de dataum
date
comando como o acima, e odate
comando que emito no terminal devem ser capazes de analisar essedate
comando noarquivo de data e produza a data correspondente.
- esta afirmação (especialmente a parte em negrito) implica para mim que eu deveria ser capaz de colocar no arquivo de dataum
Não está funcionando para mim. Ou há algo errado com meu comando date no arquivo de datas (aspas erradas, alguma sintaxe especial que não conheço...), ou a -f datefile
opção não é capaz de lidar com esta situação.
O que estou perguntando, em resumo, é:
- o
date -f
comando pode ser alimentado com um arquivo onde a string de data em uma linha é outro comando de data? por exemplo, posso colocar em um arquivo uma string "data" na primeira linha (que, como um comando, retornaria a hora do sistema) e, em seguida, alimentar esse arquivo em umdate -f
comando e obter a hora atual do sistema (gerada pelodate
comando no arquivo)?
Responder1
O formato correto para data e hora que será analisado 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, que podem 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 é originar o 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?
Responder2
A date
partir do coreutils 8.21, TZ=UTC e LC_ALL=CI obtêm
$ 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. Verifiquei o código-fonte também: a mágica acontece na rotina batch_convert
onde essencialmente há um loop over parse_datetime()
/ show_date()
assim como no caso da linha de comando (usando -d
).
Responder3
Não, você não pode ler LC_ALL=C TZ=UTC0
um arquivo com extensão date -f
.
cat tz
LC_ALL=C TZ=UTC0
date -f tz
date: invalid date ”LC_ALL=C TZ=UTC0”
Você pode, entretanto, colocar o comando inteiro em um arquivo, assim:
cat date
#!/bin/bash
LC_ALL=C TZ=UTC0 date
Em seguida, execute-o na linha de comando, que fornece:
./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