#!/bin/sh usage () { cat <&2 Usage: ${0##*/} Snapshot all Btrfs subvolumes older than 1 day to a read-only '.snapshots/SUBVOLUME/DATE'. Options: -n: No preview. -g: Run "git gc" on all .git folders. EOF } OPT_PREVIEW=true OPT_GIT_GC=false while getopts ":ghn" opt; do case $opt in g) OPT_GIT_GC=true ;; h) usage exit ;; n) OPT_PREVIEW=false ;; \?) usage exit 1 ;; esac done shift $(($OPTIND - 1)) git_gc() { # $1=rootdir find "$1" -type d -name ".git" -print -exec git --git-dir {} gc \; } snap () { # $1=fs $2=subvol local fs=$1 local subvol=$2 local choice=N local last=$(find "$fs/.snapshots/$subvol" -maxdepth 1 | tail -1) $OPT_GIT_GC && git_gc "$fs/subvol" $OPT_PREVIEW && rmirror "$fs/$subvol" "$last" echo -n "==> Snapshot '$fs/${subvol}'? (y/N) " read -r choice echo "" case "$choice" in Y|y) btrfs-snap "$fs/$subvol" ;; esac } for fs in $(findmnt -t btrfs -n --output TARGET); do for subvol in private public; do last=$(ls -1 "$fs"/.snapshots/"$subvol" | tail -1 | sed 's/_/ /') if [ -z "$last" ]; then continue fi last_date=$(date --date="$last" +%s) now=$(date +%s) if [ $(($now - $last_date)) -gt 86400 ]; then snap "$fs" "$subvol" fi unset now unset last_date unset last done done