#!/bin/bash export DISPLAY=:1 export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus # === НАСТРОЙКИ === # Папка-источник, откуда копируем SRC="$HOME" # Корневая папка для хранения бэкапов BACKUP_ROOT="$HOME/Share/backup/lap" # Только эти подпапки будут участвовать в бэкапе (относительно SRC) INCLUDE_DIRS=( ".config/nvim" ".config/qtile" ".config/fish" ".config/kitty" ".config/gtk-3.0" ".config/gtk-4.0" ".config/mpv" ".config/rofi" ".tmux" ) # Дата сегодняшнего бэкапа TODAY=$(date +%Y%m%d-%H%M%S) TODAY_DIR="$BACKUP_ROOT/$TODAY" LATEST_LINK="$BACKUP_ROOT/LATEST" # === СОЗДАНИЕ ПАПКИ ДЛЯ БЭКАПА === mkdir -p "$TODAY_DIR" echo "📦 Начало бэкапа: $TODAY_DIR из $SRC" # === ЕСЛИ ЕСТЬ LATEST, СРАВНИВАЕМ С НИМ === if [[ -L "$LATEST_LINK" && -d "$LATEST_LINK" ]]; then PREV_DIR=$(readlink -f "$LATEST_LINK") echo "🔁 Сравнение с предыдущим бэкапом: $PREV_DIR" for rel_dir in "${INCLUDE_DIRS[@]}"; do # Найдём все файлы внутри указанной папки find "$SRC/$rel_dir" -type f | while read -r src_file; do rel_path="${src_file#$SRC/}" # путь относительно SRC prev_file="$PREV_DIR/$rel_path" # путь в предыдущем бэкапе dest_file="$TODAY_DIR/$rel_path" # путь в новом бэкапе dest_dir=$(dirname "$dest_file") mkdir -p "$dest_dir" if [[ -f "$prev_file" ]]; then # сравнение хешей hash_src=$(sha256sum "$src_file" | awk '{print $1}') hash_prev=$(sha256sum "$prev_file" | awk '{print $1}') if [[ "$hash_src" == "$hash_prev" ]]; then ln "$prev_file" "$dest_file" echo "🔗 Жёсткая ссылка: $rel_path" >/dev/null else cp "$src_file" "$dest_file" echo "📄 Изменён → копия: $rel_path" fi else cp "$src_file" "$dest_file" echo "📄 Новый → копия: $rel_path" fi done done else echo "🚨 LATEST не найден. Полный бэкап." for rel_dir in "${INCLUDE_DIRS[@]}"; do if [[ -d "$SRC/$rel_dir" ]]; then mkdir -p "$TODAY_DIR/$(dirname "$rel_dir")" cp -a "$SRC/$rel_dir" "$TODAY_DIR/$(dirname "$rel_dir")" echo "✅ Скопировано: $rel_dir" fi done fi # === ОБНОВЛЯЕМ ССЫЛКУ НА LATEST === rm -f "$LATEST_LINK" ln -s "$TODAY" "$LATEST_LINK" echo "✅ Обновлена ссылка LATEST → $TODAY" notify-send "✅ Завершили бекап → $TODAY" # === УДАЛЯЕМ СТАРЫЕ БЭКАПЫ (оставляем один на каждый день по формату YYYYMMDD-HHMMSS) === echo "Удаляем лишние бэкапы" cd "$BACKUP_ROOT" || exit 1 for day in $(ls -1 | grep -E '^[0-9]{8}-[0-9]{6}$' | cut -c1-8 | sort -u); do keep=$(ls -1 | grep "^$day-" | sort | tail -n 1) for snapshot in $(ls -1 | grep "^$day-" | grep -v "^$keep$"); do echo "Удаляю $snapshot" rm -rf "$snapshot" done done