Como funciona o comando “1 mês atrás” no comando date?

17

Não tenho certeza se a data passada está dentro do dia atual ou se leva apenas 30 ou 31 dias.

por exemplo,

Se a data atual for March 28th , 1 mês atrás deve ser February 28th , mas o que acontece quando é March 30th ?

Cenário

Eu quero fazer backup de alguns arquivos todos os dias, o script salvará esses arquivos na data atual com $(date +%Y%m%d) format, como 20150603_bckp.tar.gz , quando o próximo mês chegar, removerá todos esses arquivos em 1 mês, exceto o 1º e 15º arquivos, então esta é a minha condição:

past_month = $(date -d "-1 month" +%Y%m%d)
day = $(date +%d)
if [ "$day" != 01 ] && [ "$day" != 15 ]
then
    rm /path/of/files/${past_month}_bckp.tar.gz
    echo "Depuration done"
else
    echo "Keep file"
fi

Mas eu quero saber, o que acontecerá quando a data for 30, 31 ou até mesmo o último de fevereiro? Ele manterá esses arquivos? ou remover arquivos do primeiro dia?

Quando o dia 31 for executado, a depuração será executada. Portanto, se o mês anterior tiver 30 dias, isso removerá o dia 1º arquivo?

Espero ter sugerido.

    
por tachomi 04.06.2015 / 20:49

2 respostas

19

- 1 month subtrairá um do número do mês e, em seguida, se a data resultante não for válida ( February 30 , por exemplo), ajuste-o para que seja válido. Portanto, December 31 - 1 month é December 1 , não um dia em novembro e March 31 - 1 month é March 3 (a menos que seja executado em um ano bissexto).

Veja a frase da página de informações Gnu date (que é a versão date que implementa esta sintaxe), que inclui uma boa sugestão para tornar a aritmética mais robusta:

The fuzz in units can cause problems with relative items. For example, 2003-07-31 -1 month might evaluate to 2003-07-01, because 2003-06-31 is an invalid date. To determine the previous month more reliably, you can ask for the month before the 15th of the current month. For example:

    $ date -R
    Thu, 31 Jul 2003 13:02:39 -0700
    $ date --date='-1 month' +'Last month was %B?'
    Last month was July?
    $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
    Last month was June!

Outro aviso, também citado na página de informações:

Also, take care when manipulating dates around clock changes such as daylight saving leaps. In a few cases these have added or subtracted as much as 24 hours from the clock, so it is often wise to adopt universal time by setting the TZ environment variable to UTC0 before embarking on calendrical calculations.

    
por 04.06.2015 / 21:35
2

Em vez de depender de nomes de arquivos para limpar seus arquivos de backup, você estaria mais seguro confiando nos metadados de tempo deles.

Por exemplo, você pode excluir todos os arquivos com mais de 30 dias com este comando:

/usr/bin/find /path/to/your/files -type f -ctime +30 -delete

Como um bônus grátis, executar isso todos os dias permitirá que você mantenha seus arquivos de backup em um mês consecutivo, permitindo um melhor gerenciamento do espaço em disco.

Para manter o 1º ou o 15º arquivos, você pode armazená-los em outro diretório ou atualizar o comando find com a opção -não-name.

    
por 02.12.2016 / 19:20