diff --git a/unRAID Userscript/music_sync.sh b/unRAID Userscript/music_sync.sh index 823d8c4..b7f18db 100644 --- a/unRAID Userscript/music_sync.sh +++ b/unRAID Userscript/music_sync.sh @@ -36,8 +36,8 @@ DEST2="$(normalize_path "$DEST2")" # ---------------------------------------- # TRACKING # ---------------------------------------- -declare -A CREATED_DIRS_DEST1 -declare -A CREATED_DIRS_DEST2 +declare -A CHANGED_DIRS_DEST1 +declare -A CHANGED_DIRS_DEST2 # ---------------------------------------- # FUNCTIONS @@ -73,22 +73,16 @@ rsync_cmd() { } # ---------------------------------------- -# TRACK NEW DIRECTORIES +# FIX OWNERSHIP TREE # ---------------------------------------- -track_new_dirs() { - local BASE="$1" - local FULL="$2" +fix_tree() { + local DIR="$1" + local ROOT="$2" - local PATH_ACCUM="$BASE" - - IFS='/' read -ra PARTS <<< "${FULL#$BASE/}" - - for PART in "${PARTS[@]}"; do - PATH_ACCUM="$PATH_ACCUM/$PART" - - if [ ! -d "$PATH_ACCUM" ]; then - echo "$PATH_ACCUM" - fi + while [[ "$DIR" == "$ROOT"* ]]; do + run_cmd chown "$CHOWN_USER:$CHOWN_GROUP" "$DIR" + [[ "$DIR" == "$ROOT" ]] && break + DIR="$(dirname "$DIR")" done } @@ -137,7 +131,6 @@ CHANGED=false log "---- MOVE: INCOMING → READY ----" while read -r FILE; do - [ -f "$FILE" ] || continue REL="${FILE#"$INCOMING"/}" @@ -169,15 +162,6 @@ while read -r FILE; do DIR1="$(dirname "$DEST1_FILE")" DIR2="$(dirname "$DEST2_FILE")" - # track ALL new dirs - while read -r NEWDIR; do - CREATED_DIRS_DEST1["$NEWDIR"]=1 - done < <(track_new_dirs "$DEST1" "$DIR1") - - while read -r NEWDIR; do - CREATED_DIRS_DEST2["$NEWDIR"]=1 - done < <(track_new_dirs "$DEST2" "$DIR2") - mkdir -p "$DIR1" mkdir -p "$DIR2" @@ -191,6 +175,10 @@ while read -r FILE; do if [[ $STATUS1 -eq 0 && $STATUS2 -eq 0 ]]; then CHANGED=true + + CHANGED_DIRS_DEST1["$DIR1"]=1 + CHANGED_DIRS_DEST2["$DIR2"]=1 + log "OK -> delete $REL" run_cmd rm "$FILE" else @@ -200,21 +188,21 @@ while read -r FILE; do done < <(find "$READY" -type f 2>/dev/null) # ---------------------------------------- -# 3. FIX OWNERSHIP (PRECISION MODE) +# 3. FIX OWNERSHIP (SMART TREE) # ---------------------------------------- log "CHANGED=$CHANGED" if [ "$CHANGED" = true ]; then - log "FIX OWNERSHIP (state-aware)" + log "FIX OWNERSHIP (tree mode)" - for DIR in "${!CREATED_DIRS_DEST1[@]}"; do - log "CHOWN DEST1 -> $DIR" - run_cmd chown -R "$CHOWN_USER:$CHOWN_GROUP" "$DIR" + for DIR in "${!CHANGED_DIRS_DEST1[@]}"; do + log "FIX DEST1 -> $DIR" + fix_tree "$DIR" "$DEST1" done - for DIR in "${!CREATED_DIRS_DEST2[@]}"; do - log "CHOWN DEST2 -> $DIR" - run_cmd chown -R "$CHOWN_USER:$CHOWN_GROUP" "$DIR" + for DIR in "${!CHANGED_DIRS_DEST2[@]}"; do + log "FIX DEST2 -> $DIR" + fix_tree "$DIR" "$DEST2" done fi