Comment fonctionne l'option "1 mois" dans la command de date?

Je ne sais pas si la date passée est passée dans la journée ou si elle 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 March 30th ?

Scénario

Je veux sauvegarder quelques files chaque jour, le script va save ces files dans la date actuelle avec le format $(date +%Y%m%d) , comme 20150603_bckp.tar.gz , puis quand le mois suivant arrive, files il y a 1 mois sauf les files du 1er et du 15, donc c'est mon état:

 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 quand la date sera le 30, le 31 ou même l'exemple de février passé? Il gardera ces files? ou supprimer les files 1er jour?

Quand il est 31, la dépuration va s'exécuter, donc si le mois passé a seulement 30 jours, cela va supprimer le 1er file du jour?

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

- 1 month soustrait un du numéro de 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 en novembre, et March 31 - 1 month est March 3 (à less d'être exécuté dans une année bissextile).

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

Le fuzz dans les unités peut causer des problèmes avec les articles relatifs. Par exemple, 2003-07-31 -1 month peut être évalué à 2003-07-01 car 2003-06-31 est une date invalide. Pour déterminer le mois précédent de manière plus fiable, vous pouvez requestr le mois avant 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'information:

En outre, prenez soin de manipuler les dates autour des changements d'horloge tels que les sauts d'heure d'été. Dans quelques cas, ils ont ajouté ou soustrait jusqu'à 24 heures de l'horloge, il est donc souvent judicieux d'adopter le time universel en définissant la variable d'environnement TZ sur UTC0 avant de se lancer dans des calculs calendaires.

Au lieu de s'appuyer sur les noms de files pour purger vos files de sauvegarde, vous seriez plus sûr en s'appuyant sur leurs métadonnées de time.

Par exemple, vous pouvez supprimer tous les files de plus de 30 jours avec cette command:

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

En prime gratuite, l'exécution quotidienne vous permettra de conserver vos files de sauvegarde sur un mois continu, ce qui vous permettra d'améliorer la gestion de l'espace disque.

Pour conserver les files 1 et 15, vous pouvez soit les stocker dans un autre directory, soit mettre à jour la command find avec l'option -not -name.