Não tenho certeza se essa data está dentro do dia atual ou se leva apenas 30 ou 31 dias.
por exemplo
Se a data atual é March 28th
1 mês atrás, deve ser February 28th
, mas o que acontece quando é March 30th
?
Cenário
Quero fazer backup de alguns arquivos todos os dias, o script salvará esses arquivos dentro da data atual com o $(date +%Y%m%d)
formato, como 20150603_bckp.tar.gz
, por exemplo, quando chegar o próximo mês, remova todos os arquivos dentro de 1 mês atrás, exceto os arquivos do 1º e do 15º, então é isso 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 mesmo o exemplo de fevereiro passado? Vai manter esses arquivos? ou remover arquivos do 1º dia?
Quando é 31, a depuração será executada. Portanto, se o mês passado tiver apenas 30 dias, isso removerá o 1º arquivo do dia?
Espero ter sugerido.
Respostas:
- 1 month
subtrairá um do número do mês e, se a data resultante não for válida (February 30
por exemplo), ajuste-a para que seja válida. AssimDecember 31 - 1 month
éDecember 1
, não é um dia em novembro eMarch 31 - 1 month
éMarch 3
(a menos que seja executado em um ano bissexto).Aqui está uma citação da página de informações do Gnu
date
(que é adate
versão que implementa essa sintaxe), que inclui uma boa sugestão para tornar a aritmética mais robusta:Outro aviso, também citado na página de informações:
fonte
date
implementação; no meu livro, é semanticamente contra-intuitivo. - Obrigado por apontar isso, é bom saber.Em vez de confiar nos nomes de arquivos para remover seus arquivos de backup, você estaria mais seguro contando com os metadados de tempo deles.
Por exemplo, você pode excluir todos os arquivos com mais de 30 dias com este comando:
Como um bônus grátis, a execução diária 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 os arquivos 1 ou 15, você pode armazená-los em outro diretório, ou atualizar o comando find com a opção -not -name.
fonte
Você pode tentar ver como a data funciona da seguinte maneira:
Então, acho que, com base no atual mês passado (não atual, se é março), diminui o número de dias desde o último mês a partir do mês atual.
Você pode tentar a seguinte sintaxe para excluir arquivos com mais de um número de dias (no exemplo abaixo de 31 dias). Uma linha para resolver o problema (isto é para uma abordagem simples).
Para uma abordagem mais detalhada, você também pode fazer algo assim: 1. Encontrar o número de dias para o mês atual:
Localizando o número de dias do último mês:
echo "$ (cal $ (data +% m) $ (data +% y) | egrep -v" $ (data +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (data -d "há um mês atrás" +% m) $ (data +% y) | egrep -v "$ (data +% y) | Su" | xargs | awk '{print $ NF}') | bc
Então agora encontramos a diferença entre esses dois meses:
echo "$ (cal $ (data +% m) $ (data +% y) | egrep -v" $ (data +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (data -d "há um mês atrás" +% m) $ (data +% y) | egrep -v "$ (data +% y) | Su" | xargs | awk '{print $ NF}') | bc
Agora vamos atribuir algumas variáveis a essas 3 etapas. Etapa 1 Nome da variável: FCM Etapa 2 Nome da variável: FLM Etapa 3 Variável NAme: DCL
Verifique se $ DCL é igual a 0 (zero) e exclua com base na diferença entre $ FCM e $ FLM:
Você também pode adicionar uma variável a "/ path / to / folde / with / arhives /".
Conclusão: Se você deseja excluir arquivos com mais de um mês (exatamente), precisará ajustar o número exato de dias, se estiver usando o comando "date" e "+1 month ago".
fonte