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 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 avec un $(date +%Y%m%d)
format, comme 20150603_bckp.tar.gz
, puis le mois suivant, supprimez tous ces fichiers dans le mois 1 sauf les fichiers du 1er et du 15e, c'est donc 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 lorsque la date est 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.
Réponses:
- 1 month
en soustraira un du numéro du mois, puis si la date résultante n'est pas valide (February 30
par exemple), ajustez-la pour qu'elle soit valide. Il enDecember 31 - 1 month
est ainsiDecember 1
, pas un jour en novembre, etMarch 31 - 1 month
estMarch 3
(sauf s'il est exécuté au cours d'une année bissextile).Voici une citation de la page d'informations de Gnu
date
(qui est ladate
version qui implémente cette syntaxe), qui comprend une bonne suggestion pour rendre l'arithmétique plus robuste:Un autre avertissement, également cité sur la page d'informations:
la source
date
implémentation; dans mon livre, c'est sémantiquement contre-intuitif. - Merci de l'avoir signalé, c'est bon à savoir.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:
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.
la source
Vous pouvez essayer de voir comment fonctionne la date comme suit:
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).
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:
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
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
Vérifiez si $ DCL est égal à 0 (zéro) et supprimez en fonction de la différence entre $ FCM et $ FLM:
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".
la source