#!/bin/bash # OneDrive -> /mnt/backup. Ничего не удаляется навсегда: # current/ — точное зеркало OneDrive # archive/<время>/ — всё, что в OneDrive удалили или перезаписали (хранится вечно) # manifests/ — quickxor-хэши архивных файлов (для onedrive-verify) # logs/ — журнал каждого прогона: какие файлы скачаны/изменены/убраны в архив set -euo pipefail ROOT=/mnt/backup/onedrive TS=$(date +%F_%H%M) mountpoint -q /mnt/backup || { echo "/mnt/backup не смонтирован — пропуск"; exit 1; } mkdir -p "$ROOT"/{current,archive,manifests,logs} LOG="$ROOT/logs/sync-$TS.log" # rclone сам сверяет хэш каждого скачанного файла с хэшем OneDrive rclone sync onedrive: "$ROOT/current" \ --backup-dir "$ROOT/archive/$TS" \ --exclude "/Personal Vault/**" \ --transfers 4 --checkers 8 \ --retries 5 --low-level-retries 20 \ --log-file "$LOG" --log-level INFO \ --stats 10m --stats-one-line if [ -d "$ROOT/archive/$TS" ]; then rclone hashsum quickxor "$ROOT/archive/$TS" > "$ROOT/manifests/archive-$TS.qxh" echo "в архив ушло: $(wc -l < "$ROOT/manifests/archive-$TS.qxh") файлов" fi echo "OK: current=$(du -sh "$ROOT/current" | cut -f1), диск занят на $(df --output=pcent /mnt/backup | tail -1 | tr -d " ")" [ "$(df --output=pcent /mnt/backup | tail -1 | tr -dc 0-9)" -lt 90 ] || { echo "ВНИМАНИЕ: диск заполнен >90%"; exit 2; }