web-dev-qa-db-fra.com

Comment fonctionne l'option "il y a 1 mois" dans la commande date?

Je ne sais pas si cela obtient la date passée dans la journée en cours ou si cela ne prend que 30 ou 31 jours.

par exemple.

Si la date actuelle est March 28th, Il y a 1 mois doit être February 28th, Mais que se passe-t-il quand c'est March 30th?

Scénario

Je veux sauvegarder certains fichiers chaque jour, le script enregistrera ces fichiers dans la date actuelle au format $(date +%Y%m%d), comme 20150603_bckp.tar.gz, Puis lorsque le mois suivant arrivera, supprimez tous ces fichiers dans 1 il y a un mois sauf les fichiers du 1er et du 15ème, voici donc ma condition:

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

Mais je veux savoir, que se passera-t-il lorsque la date sera le 30, le 31 ou même l'exemple de février dernier? Il conservera ces fichiers? ou supprimer les fichiers du premier jour?

Quand c'est le 31, la dépuration s'exécutera, donc si le mois dernier n'avait que 30 jours, cela supprimera le premier fichier du jour?

J'espère que j'ai laissé entendre.

23
tachomi

- 1 month en soustraira un du mois, puis si la date résultante n'est pas valide (February 30, par exemple), ajustez-le pour qu'il soit valide. Donc December 31 - 1 month est December 1, pas un jour de novembre, et March 31 - 1 month est March 3 (sauf si exécuté au cours d'une année bissextile).

Voici une citation de la page info pour Gnu date (qui est la version date qui implémente cette syntaxe), qui inclut une bonne suggestion pour rendre l'arithmétique plus robuste:

Le duvet en unités peut provoquer des problèmes avec les éléments relatifs. Par exemple, 2003-07-31 -1 month peut correspondre à 2003-07-01, car 2003-06-31 n'est pas une date valide. Pour déterminer le mois précédent de manière plus fiable, vous pouvez demander le mois précédant le 15 du mois en cours. Par exemple:

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

Un autre avertissement, également cité sur la page d'informations:

Faites également attention lorsque vous manipulez les dates en fonction des changements d'horloge, comme les sauts d'heure d'été. Dans certains cas, ceux-ci ont ajouté ou soustrait jusqu'à 24 heures à l'horloge, il est donc souvent judicieux d'adopter l'heure universelle en définissant la variable d'environnement TZ sur UTC0 avant de se lancer dans des calculs calendaires.

25
rici

Au lieu de vous fier aux noms de fichiers pour purger vos fichiers de sauvegarde, vous seriez plus sûr de vous fier à leurs métadonnées temporelles.

Par exemple, vous pouvez supprimer tous les fichiers de plus de 30 jours avec cette commande:

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

En bonus gratuit, le faire tous les jours vous permettra de conserver vos fichiers de sauvegarde sur un mois glissant, permettant une meilleure gestion de l'espace disque.

Pour conserver les 1er ou 15e fichiers, vous pouvez soit les stocker dans un autre répertoire, soit mettre à jour la commande find avec l'option -not -name.

2
Bertrand Lupart

Vous pouvez essayer de voir comment fonctionne la date comme suit:

date -d "$(date -d "Mar 31 2019" +%F) +1 month ago"
Sun Mar  3 00:00:00 EET 2019

Je pense donc que sur la base du mois dernier courant (pas courant, si c'est mars), diminue le nombre de jours à partir du dernier mois du mois courant.

Vous pouvez essayer la syntaxe suivante pour supprimer des fichiers antérieurs à un certain nombre de jours (dans l'exemple ci-dessous 31 jours). Une ligne pour résoudre le problème (c'est pour une approche simple).

find /path/to/folder/with/arhives/ -mindepth 1 -mtime +31 -delete

Pour une approche plus détaillée, vous pouvez également faire quelque chose comme ceci: 1. Trouver le nombre de jours pour le mois courant:

cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}'
  1. Trouver le nombre de jours du dernier mois:

    echo "$ (cal $ (date +% m) $ (date +% y) | egrep -v" $ (date +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (date -d "il y a +1 mois" +% m) $ (date +% y) | egrep -v "$ (date +% y) | Su" | xargs | awk '{print $ NF}') | avant JC

  2. Alors maintenant, nous trouvons la différence entre ces deux mois:

    echo "$ (cal $ (date +% m) $ (date +% y) | egrep -v" $ (date +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (date -d "il y a +1 mois" +% m) $ (date +% y) | egrep -v "$ (date +% y) | Su" | xargs | awk '{print $ NF}') | avant JC

Permet maintenant d'assigner quelques variables à ces 3 étapes. Étape 1 Nom de la variable: FCM Étape 2 Nom de la variable: FLM Étape 3 Variable NAme: DCL

FCM=$(cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')
FLM=$(al $(date -d "+1 month ago" +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')
DCL=$(echo "$FCM-$FLM" | bc)

Vérifiez si $ DCL est égal à 0 (zéro) et supprimez en fonction de la différence entre $ FCM et $ FLM:

if [ $DCL -ne 0 ]; then
    if [ $DCL -lt 0 ]; then
        find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$(echo "$DCL+$FLM" | bc) -delete
    Elif [ $DCL -gt 0 ]; then
        find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$(echo "$DCL+$FLM" | bc) -delete
    fi
else
    find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$FLM -delete
fi

Vous pouvez également ajouter une variable à "/ path/to/folde/with/arhives /".

Conclusion: Si vous souhaitez supprimer des fichiers antérieurs à un mois (exactement), vous devez ajuster le nombre exact de jours, si vous utilisez la commande "date" et "il y a +1 mois".

0
Mihai M