Files
dotfiles/bin/daily_backup_hardlink.sh
Archie Fox 06b8ee8caf Init commit
2025-06-08 06:59:19 +03:00

104 lines
3.4 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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