#!/bin/bash # # This will by default take snapshots of all zfs filesystems, # but could be adapted to only pull specific ones. This script # will also rotate snapshots, removing those that are older # than 2 weeks. # CURDATE=$(date +%Y%m%d) TWOWEEKSAGO=$(date -d'2 weeks ago' +%Y%m%d) create_snapshot() { if [ "$(/sbin/zfs list -tsnapshot | grep $1@$CURDATE)" = "" ]; then /sbin/zfs snapshot $1@$CURDATE fi } prune_old () { if [ "$(/sbin/zfs list -tsnapshot | grep "$1@")" != "" ]; then for f in $(/sbin/zfs list -tsnapshot | grep "$1@" | awk '{print $1}'); do echo ">>> $f" SNAPDATE=$(echo $f | sed -e 's/@/ /' | awk '{print $2}') if [ $SNAPDATE -lt $TWOWEEKSAGO ]; then # echo "destroying snapshot $f" /sbin/zfs destroy $f fi done fi } FS=$(/sbin/zfs list | awk '{print $1}' | tail -n+2) for f in $FS; do create_snapshot $f prune_old $f 2>/dev/null done