Also see previous post https://blog.ls-al.com/bash-date-usage-for-naming if you are interested. This post is similar but more specific to restic tagging.
Below is a test script and a test run. At the time of restic backup I create a tag in order to do snapshot forget based on tags.
root@pop-os:/tmp# cat backup-tags.sh#!/bin/bash
create_tag () { tag="daily" if [ $(date +%a) == "Sun" ]; then tag="weekly" ; fi if [ $(date +%d) == "01" ]; then tag="monthly" if [ $(date +%b) == "Jan" ]; then tag="yearly" fi fi}create_tagecho "backup policy: " $tag
create_tag_unit_test () { for i in {1..95} do tdate=$(date -d "+$i day") tag="daily" if [ $(date -d "+$i day" +%a) == "Sun" ]; then tag="weekly" ; fi if [ $(date -d "+$i day" +%d) == "01" ]; then tag="monthly" if [ $(date -d "+$i day" +%b) == "Jan" ]; then tag="yearly" fi fi printf "%s - %s - %s | " "$(date -d "+$i day" +%d)" "$(date -d "+$i day" +%a)" "$tag" if [ $(( $i %5 )) -eq 0 ]; then printf "\n"; fi done}create_tag_unit_test
root@pop-os:/tmp# ./backup-tags.shbackup policy: daily22 - Fri - daily | 23 - Sat - daily | 24 - Sun - weekly | 25 - Mon - daily | 26 - Tue - daily |27 - Wed - daily | 28 - Thu - daily | 29 - Fri - daily | 30 - Sat - daily | 01 - Sun - monthly |02 - Mon - daily | 03 - Tue - daily | 04 - Wed - daily | 05 - Thu - daily | 06 - Fri - daily |07 - Sat - daily | 08 - Sun - weekly | 09 - Mon - daily | 10 - Tue - daily | 11 - Wed - daily |12 - Thu - daily | 13 - Fri - daily | 14 - Sat - daily | 15 - Sun - weekly | 16 - Mon - daily |17 - Tue - daily | 18 - Wed - daily | 19 - Thu - daily | 20 - Fri - daily | 21 - Sat - daily |22 - Sun - weekly | 23 - Mon - daily | 24 - Tue - daily | 25 - Wed - daily | 26 - Thu - daily |27 - Fri - daily | 28 - Sat - daily | 29 - Sun - weekly | 30 - Mon - daily | 31 - Tue - daily |01 - Wed - yearly | 02 - Thu - daily | 03 - Fri - daily | 04 - Sat - daily | 05 - Sun - weekly |06 - Mon - daily | 07 - Tue - daily | 08 - Wed - daily | 09 - Thu - daily | 10 - Fri - daily |11 - Sat - daily | 12 - Sun - weekly | 13 - Mon - daily | 14 - Tue - daily | 15 - Wed - daily |16 - Thu - daily | 17 - Fri - daily | 18 - Sat - daily | 19 - Sun - weekly | 20 - Mon - daily |Below is the restic backup script setting a tag and then snapshot forget based on the tag.
As always this is NOT tested use at your own risk.
My “policy” is:
- weekly on Sunday
- 01 of every month is a monthly except if 01 is also a new year which makes it a yearly
- everything else is a daily
root@pop-os:~/scripts# cat desktop-restic.sh#!/bin/bash### wake up backup server and restic backup to 3TB ZFS mirrorcd /root/scripts./wake-backup-server.sh
source /root/.restic.env
## Quick and dirty logic for snapshot taggingcreate_tag () { tag="daily" if [ $(date +%a) == "Sun" ]; then tag="weekly" ; fi if [ $(date +%d) == "01" ]; then tag="monthly" if [ $(date +%b) == "Jan" ]; then tag="yearly" fi fi}
create_tagrestic backup -q /DATA /ARCHIVE --tag "$tag" --exclude *.vdi --exclude *.iso --exclude *.ova --exclude *.img --exclude *.vmdk
restic forget -q --tag daily --keep-last 7restic forget -q --tag weekly --keep-last 4restic forget -q --tag monthly --keep-last 12
if [ "$tag" == "weekly" ]; then restic -q prunefi
sleep 1mssh user@192.168.1.250 sudo shutdown now