Refactor rename logic into reusable function

Extract duplicate rename code from --rename option and interactive 'r' branch into find_unique_filename() function. Reduces code duplication and improves maintainability.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Misaka Company
2026-01-28 14:36:23 +08:00
parent 45c8623666
commit ae8642cdfe

View File

@@ -95,6 +95,36 @@ fi
# Get filename # Get filename
FILENAME=$(basename "$FILE_PATH") FILENAME=$(basename "$FILE_PATH")
# Function to find unique filename by adding numeric suffix
# Sets global variables: TARGET_PATH, FILENAME
find_unique_filename() {
local original_filename="$1"
local subpath="$2"
local counter=1
local base_name="${original_filename%.*}"
local ext="${original_filename##*.}"
# Handle files without extension
if [ "$base_name" = "$ext" ]; then
base_name="$original_filename"
ext=""
else
ext=".$ext"
fi
while true; do
local new_name="${base_name}-${counter}${ext}"
local new_target="minio/obsidian/${subpath}/${new_name}"
if ! mc stat "$new_target" >/dev/null 2>&1; then
TARGET_PATH="$new_target"
FILENAME="$new_name"
echo "📝 Renamed to: $FILENAME"
return 0
fi
counter=$((counter + 1))
done
}
# Construct target path # Construct target path
TARGET_PATH="minio/obsidian/${SUBPATH}/${FILENAME}" TARGET_PATH="minio/obsidian/${SUBPATH}/${FILENAME}"
@@ -116,29 +146,7 @@ if mc stat "$TARGET_PATH" >/dev/null 2>&1; then
mc cp "$TARGET_PATH" "$BACKUP_PATH" mc cp "$TARGET_PATH" "$BACKUP_PATH"
# User explicitly specified --rename # User explicitly specified --rename
elif [ "$RENAME" = true ]; then elif [ "$RENAME" = true ]; then
COUNTER=1 find_unique_filename "$FILENAME" "$SUBPATH"
BASE_NAME="${FILENAME%.*}"
EXT="${FILENAME##*.}"
if [ "$BASE_NAME" = "$EXT" ]; then
# No extension
BASE_NAME="$FILENAME"
EXT=""
else
EXT=".$EXT"
fi
while true; do
NEW_NAME="${BASE_NAME}-${COUNTER}${EXT}"
NEW_TARGET="minio/obsidian/${SUBPATH}/${NEW_NAME}"
if ! mc stat "$NEW_TARGET" >/dev/null 2>&1; then
TARGET_PATH="$NEW_TARGET"
FILENAME="$NEW_NAME"
echo "📝 Renamed to: $FILENAME"
break
fi
COUNTER=$((COUNTER + 1))
done
# User explicitly specified --force # User explicitly specified --force
elif [ "$FORCE" = true ]; then elif [ "$FORCE" = true ]; then
echo "⚠️ Overwriting existing file: $TARGET_PATH" echo "⚠️ Overwriting existing file: $TARGET_PATH"
@@ -173,28 +181,8 @@ if mc stat "$TARGET_PATH" >/dev/null 2>&1; then
break break
;; ;;
r|R|rename) r|R|rename)
COUNTER=1 find_unique_filename "$FILENAME" "$SUBPATH"
BASE_NAME="${FILENAME%.*}" break
EXT="${FILENAME##*.}"
if [ "$BASE_NAME" = "$EXT" ]; then
BASE_NAME="$FILENAME"
EXT=""
else
EXT=".$EXT"
fi
while true; do
NEW_NAME="${BASE_NAME}-${COUNTER}${EXT}"
NEW_TARGET="minio/obsidian/${SUBPATH}/${NEW_NAME}"
if ! mc stat "$NEW_TARGET" >/dev/null 2>&1; then
TARGET_PATH="$NEW_TARGET"
FILENAME="$NEW_NAME"
echo "📝 Renamed to: $FILENAME"
break 2
fi
COUNTER=$((COUNTER + 1))
done
;; ;;
*) *)
echo "Invalid choice. Please enter o, s, b, or r" echo "Invalid choice. Please enter o, s, b, or r"