aboutsummaryrefslogtreecommitdiff
path: root/files/.config/nnn/plugins/fixname
diff options
context:
space:
mode:
Diffstat (limited to 'files/.config/nnn/plugins/fixname')
-rwxr-xr-xfiles/.config/nnn/plugins/fixname75
1 files changed, 75 insertions, 0 deletions
diff --git a/files/.config/nnn/plugins/fixname b/files/.config/nnn/plugins/fixname
new file mode 100755
index 0000000..4047152
--- /dev/null
+++ b/files/.config/nnn/plugins/fixname
@@ -0,0 +1,75 @@
+#!/usr/bin/env bash
+
+# Description: Clean filename or dirname (either hovered or selections)
+# to be more shell-friendly. This script cleans
+# non A-Za-z0-9._- characters.
+# and replaces it with underscore (_).
+#
+# It supports cleaning single/double quote, newline,
+# leading, trailing spaces.
+#
+# eg.
+# to be continued (つづく).mp4 -> to_be_continued______.mp4
+# [work] stuff.txt -> _work__stuff.txt
+# home's server -> home_s_server
+# qwe\trty -> __qwe_rty
+#
+# And if there are two almost similar filenames
+# like: 'asd]f' and 'asd f' both will be renamed to 'asd_f',
+# to avoid overwriting, the last file will be prepended by _.
+# So they will be: 'asd_f' and '_asd_f'
+#
+# Dependencies: sed
+#
+# Shell: Bash
+# Author: Benawi Adha
+
+prompt=true
+sel=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
+
+cleanup() {
+ # printf "%s" "$1" | sed -e 's/[^A-Za-z0-9._-]/_/g'
+ printf "%s" "$1" | sed 's/[^A-Za-z0-9._-]/_/g' | sed ':a;N;$!ba;s/\n/_/g'
+}
+
+if [ -s "$sel" ]; then
+ targets=()
+ while IFS= read -r -d '' i || [ -n "$i" ]; do
+ targets+=( "$(basename "$i")" )
+ done < "$sel"
+else
+ targets=("$1")
+fi
+
+for i in "${targets[@]}"; do
+ printf "%s -> %s\n" "$i" "$(cleanup "$i")";
+done
+
+if $prompt; then
+ echo
+ printf "Proceed [Yn]? "
+ read -r input
+ case "$input" in
+ y|Y|'')
+ ;;
+ *)
+ echo "Canceled"
+ exit
+ ;;
+ esac
+fi
+
+for i in "${targets[@]}"; do
+ if [ "$i" != "$(cleanup "$i")" ]; then
+ tmp=''
+ if [ -e "$(cleanup "$i")" ]; then
+ tmp='_'
+ fi
+ mv "$i" "$tmp$(cleanup "$i")";
+ fi
+done
+
+# Clear selection
+if [ -s "$sel" ] && [ -p "$NNN_PIPE" ]; then
+ printf "-" > "$NNN_PIPE"
+fi