#!/usr/bin/env bash set -euo pipefail # Move large legacy folders from local disk to NAS with verification-friendly flow. # Default mode is DRY-RUN. # # Examples: # scripts/ops/netgescon-move-to-nas.sh \ # --nas-root /mnt/nas_netgescon/migrazioni-locali \ # --source /home/michele/backup-completo \ # --source /var/www/netgescon_OLD # # scripts/ops/netgescon-move-to-nas.sh \ # --nas-root /mnt/nas_netgescon/migrazioni-locali \ # --source /home/michele/backup-completo \ # --apply --purge-source NAS_ROOT="/mnt/nas_netgescon/migrazioni-locali" APPLY="no" PURGE_SOURCE="no" TS="$(date +%Y%m%d-%H%M%S)" LOG_DIR="/tmp/netgescon-nas-move-${TS}" declare -a SOURCES=() die() { echo "Error: $*" >&2 exit 1 } usage() { cat <<'EOF' Usage: netgescon-move-to-nas.sh --source [--source ...] [options] Options: --source Source directory to move/copy (can be used multiple times) --nas-root NAS base destination (default: /mnt/nas_netgescon/migrazioni-locali) --apply Execute real copy (default: dry-run) --purge-source Remove source after successful copy (only with --apply) -h, --help Show this help EOF } while [[ $# -gt 0 ]]; do case "$1" in --source) SOURCES+=("$2") shift 2 ;; --nas-root) NAS_ROOT="$2" shift 2 ;; --apply) APPLY="yes" shift ;; --purge-source) PURGE_SOURCE="yes" shift ;; -h|--help) usage exit 0 ;; *) usage die "Unknown option: $1" ;; esac done [[ ${#SOURCES[@]} -gt 0 ]] || { usage; die "At least one --source is required"; } [[ -d "$NAS_ROOT" ]] || die "NAS root not found/mounted: $NAS_ROOT" if [[ "$PURGE_SOURCE" == "yes" && "$APPLY" != "yes" ]]; then die "--purge-source requires --apply" fi mkdir -p "$LOG_DIR" echo "== NetGescon NAS Move ==" echo "Mode: $( [[ "$APPLY" == "yes" ]] && echo "APPLY" || echo "DRY-RUN" )" echo "Purge source after copy: $PURGE_SOURCE" echo "NAS root: $NAS_ROOT" echo "Log dir: $LOG_DIR" echo run_rsync() { local src="$1" local dst="$2" local -a args=( -a --human-readable --info=stats2,name0 --no-owner --no-group ) if [[ "$APPLY" != "yes" ]]; then args+=(--dry-run) fi rsync "${args[@]}" "$src/" "$dst/" } for src in "${SOURCES[@]}"; do [[ -d "$src" ]] || { echo "Skip missing source: $src"; continue; } src_abs="$(readlink -f "$src")" src_name="$(basename "$src_abs")" src_parent_name="$(basename "$(dirname "$src_abs")")" dst="$NAS_ROOT/${src_parent_name}/${src_name}" mkdir -p "$dst" echo "------------------------------------------------------------" echo "Source: $src_abs" echo "Dest: $dst" echo "[1/3] Size source" du -sh "$src_abs" || true echo "[2/3] Rsync" run_rsync "$src_abs" "$dst" | tee "$LOG_DIR/${src_name}.log" if [[ "$APPLY" == "yes" ]]; then echo "[3/3] Verify destination size" du -sh "$dst" || true if [[ "$PURGE_SOURCE" == "yes" ]]; then echo "[PURGE] Removing source: $src_abs" rm -rf "$src_abs" fi fi echo "Done: $src_abs" echo done echo "All tasks completed." echo "Logs: $LOG_DIR"