104 lines
3.4 KiB
Bash
Executable File
104 lines
3.4 KiB
Bash
Executable File
#!/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
|