diff --git a/.local/bin/fixnames b/.local/bin/fixnames new file mode 100644 index 00000000..37f101d5 --- /dev/null +++ b/.local/bin/fixnames @@ -0,0 +1,33 @@ +#!/bin/sh + +find . -depth -name '*' -print0 | xargs -0 -n1 -P10 -I{} sh -c ' + generate_unique_name() { + base_name="$1"; ext="$2"; dest_path="$3"; count=1 + [ -z "$ext" ] && new_name="$base_name" || new_name="${base_name}.${ext}" + while [ -e "${dest_path}/${new_name}" ]; do + [ -z "$ext" ] && new_name="${base_name}_${count}" || new_name="${base_name}_${count}.${ext}" + count=$(( count + 1 )) + done + echo "$new_name" + } + + process_item() { + item_path="$1"; [ "$item_path" = "." ] && return + dir_name=$(dirname "$item_path"); base_name=$(basename "$item_path") + if [ -d "$item_path" ]; then + new_name=$(echo "$base_name" | sed -E "s/[^a-zA-Z0-9 _.-]+//g; s/[ .-]+/_/g; s/_+/_/g; s/^_//; s/_$//; s/(.*)/\L\1/") + [ -z "$new_name" ] && new_name="untitled" + else + file_ext="${base_name##*.}" + base_name_no_ext="${base_name%.*}" + new_base_name_no_ext=$(echo "$base_name_no_ext" | sed -E "s/[^a-zA-Z0-9 _.-]+//g; s/[ .-]+/_/g; s/_+/_/g; s/^_//; s/_$//; s/(.*)/\L\1/") + [ -z "$new_base_name_no_ext" ] && new_base_name_no_ext="untitled" + new_name="${new_base_name_no_ext}.${file_ext}" + fi + if [ "$base_name" != "$new_name" ]; then + [ -e "${dir_name}/${new_name}" ] && new_name=$(generate_unique_name "${new_name%.*}" "${new_name##*.}" "$dir_name") + mv "$item_path" "${dir_name}/${new_name}" 2>/dev/null || true + fi + } + process_item "{}" +' 2>/dev/null