#!/usr/bin/env bash set -euo pipefail # Script directory and backups directory setup SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BACKUP_DIR="${SCRIPT_DIR}/backups" mkdir -p "${BACKUP_DIR}" # Timestamp for archive name TIMESTAMP="$(date +"%Y%m%d_%H%M%S")" ZIP_FILENAME="konsole_backup_${TIMESTAMP}.zip" ZIP_FILEPATH="${BACKUP_DIR}/${ZIP_FILENAME}" # Temporary staging directory TEMP_DIR="$(mktemp -d)" trap 'rm -rf "${TEMP_DIR}"' EXIT echo "=== Starting Konsole Configuration Backup ===" # Define target paths relative to HOME CONFIG_PATHS=( ".config/konsolerc" ".local/share/konsole" ".local/share/kxmlgui5/konsole" ".config/konsole.notifyrc" ".config/konsolesshconfig" ) COPIED_COUNT=0 for rel_path in "${CONFIG_PATHS[@]}"; do src_path="${HOME}/${rel_path}" dest_path="${TEMP_DIR}/${rel_path}" if [ -e "${src_path}" ]; then mkdir -p "$(dirname "${dest_path}")" cp -a "${src_path}" "${dest_path}" echo " [+] Staged: ~/${rel_path}" COPIED_COUNT=$((COPIED_COUNT + 1)) else echo " [-] Skipped (not found): ~/${rel_path}" fi done if [ "${COPIED_COUNT}" -eq 0 ]; then echo "Error: No Konsole configuration files found to backup." exit 1 fi # Create zip file from staging area echo "Creating backup archive: ${ZIP_FILENAME}..." ( cd "${TEMP_DIR}" zip -q -r "${ZIP_FILEPATH}" . ) echo "Backup successfully saved to: ${ZIP_FILEPATH}" # Retention Policy: keep at most 10 recent backup zip files MAX_BACKUPS=10 mapfile -t BACKUP_FILES < <(find "${BACKUP_DIR}" -maxdepth 1 -name "konsole_backup_*.zip" | sort -r) TOTAL_BACKUPS="${#BACKUP_FILES[@]}" if [ "${TOTAL_BACKUPS}" -gt "${MAX_BACKUPS}" ]; then echo "Cleaning up older backups (keeping top ${MAX_BACKUPS})..." for (( i=MAX_BACKUPS; i