.
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user