Manipulando string de data e hora de forma consistente com o formato de data% Y% m% d

5

Eu preciso criar arquivos de log que são essencialmente carimbos de data com o prefixo yp_ e sufixo .log e um número de dia manipulado:

$ touch yp_$(echo "$(date +%Y%m%d)-10" | /usr/bin/bc -l).log
$ ls
yp_20150912.log   # ... ok for today's date.

Tudo bem por hoje, mas todo o inferno se solta quando o número do dia está entre 01 e 10 incluído. O resultado não pode ser interpretado como um carimbo de data por mais tempo.

Por exemplo Imagine que o dia seja o dia 8 de março de 2016, ou seja, '20160308'. Como codifico as informações acima para garantir que a subtração de 10 dias produza não '20150298', mas '20150227'? Também teste a resposta do ano com 19820103 ...

- Eu olhei para man date .

- apropos date vomita 161 ocorrências que eu também analisei.

Alguém pode ajudar com esse one-liner?

    
por Cbhihe 22.09.2015 / 18:17

2 respostas

6

Eu preciso manipular datas (enquanto presto atenção aos anos bissextos)

Felizmente, GNU date tem uma opção muito útil -d :

-d, --date=STRING
          display time described by STRING, not 'now'

(de man date )

Isso aceita descrições de datas arbitrárias, como "now + 1 year" "Jan 28 + 3 weeks"; ou no seu caso: "agora - 10 dias":

touch yp_$(date -d 'now - 10 days' +%Y%m%d).log

Não há necessidade de invocações confusas de bc , sem se preocupar com anos bissextos - o GNU date cuidará disso.

    
por 22.09.2015 / 18:25
6

Para exibir uma data formatada para x dias a partir de hoje:

$ echo $(date +%Y%m%d)
20150922

$ echo $(date -d -10days +%Y%m%d)
20150912

$ echo $(date -d +10days +%Y%m%d)
20151002
    
por 22.09.2015 / 18:25