Skip to content

Instantly share code, notes, and snippets.

@MGlolenstine
Created June 3, 2022 13:32
Show Gist options
  • Save MGlolenstine/9778e2ec2cecb49bfddfe5542daa59e6 to your computer and use it in GitHub Desktop.
Save MGlolenstine/9778e2ec2cecb49bfddfe5542daa59e6 to your computer and use it in GitHub Desktop.
Simple BASH backup script.
#!/bin/bash
KEEP_DAILY=3
KEEP_WEEKLY=1
KEEP_MONTHLY=1
KEEP_YEARLY=1
# Folder being backed up
SRC_DIR="data"
# Backup location
TARGET_DIR="bkp"
DURATION_SELECTOR="$1"
# Directory name for today's date
FOLDER_NAME=`date -u +"%Y-%m-%d"`
FOLDER_NAME="$TARGET_DIR/${DURATION_SELECTOR}_$FOLDER_NAME"
backup_directory(){
TARGET_PATH="$1"
echo "backing up $SRC_DIR into $TARGET_PATH..."
mkdir -p $TARGET_PATH
#TODO: Replace with rsync or something similar
cp -r $SRC_DIR $TARGET_PATH
}
remove_oldest_n(){
TIMES=$(ls $TARGET_DIR | grep "$DURATION_SELECTOR\_" | sed "s/$DURATION_SELECTOR\_//g" | xargs -I _ date -d _ +"%s")
# Turn the string with newlines to an array
readarray -t TIMES <<< "$TIMES"
if [[ ${#TIMES[@]} -gt $1 ]];then
for time in "${TIMES[@]}"; do
if [[ $time -lt ${TIMES[-$1]} ]]; then
DNAME=`date -d @$time +"%Y-%m-%d"`
echo "rm -rf $TARGET_DIR/${DURATION_SELECTOR}_$DNAME"
rm -rf $TARGET_DIR/${DURATION_SELECTOR}_$DNAME
fi
done
fi
}
if [ "$1" == "d" ];then
echo "Starting daily backup..."
backup_directory $FOLDER_NAME
remove_oldest_n $KEEP_DAILY
elif [ "$1" == "w" ]; then
echo "Starting weekly backup..."
backup_directory $FOLDER_NAME
remove_oldest_n $KEEP_WEEKLY
elif [ "$1" == "m" ]; then
echo "Starting monthly backup..."
backup_directory $FOLDER_NAME
remove_oldest_n $KEEP_MONTHLY
elif [ "$1" == "y" ]; then
echo "Starting yearly backup..."
backup_directory $FOLDER_NAME
remove_oldest_n $KEEP_YEARLY
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment