commit c215c5de8087e1cc352f4f7f0d187231ac367a8c
parent 67994ff4b2bb1a77ba987cf4ac0793ef13190c3a
Author: KlzXS <azszwymmvqdi@yahoo.com>
Date: Sun, 15 Mar 2020 15:19:05 +0100
Convert batchrename to bash and rename it (#495)
Diffstat:
| A | plugins/.nmv | | | 136 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| D | plugins/batchrename | | | 195 | ------------------------------------------------------------------------------- |
2 files changed, 136 insertions(+), 195 deletions(-)
diff --git a/plugins/.nmv b/plugins/.nmv
@@ -0,0 +1,136 @@
+#!/usr/bin/env bash
+
+# Description: An almost fully POSIX compliant batch file renamer
+#
+# Note: nnn auto-detects and invokes this plugin if available
+#
+# Capabilities:
+# 1. Basic file rename
+# 2. Detects order change
+# 3. Can move files
+# 4. Can remove files
+# 5. Switch number pairs to swap filenames
+#
+# Shell: bash
+# Author: KlzXS
+
+EDITOR="${EDITOR:-vi}"
+TMPDIR="${TMPDIR:-/tmp}"
+INCLUDE_HIDDEN="${INCLUDE_HIDDEN:-0}"
+
+selection=${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection
+exit_status=0
+
+dst_file=$(mktemp "$TMPDIR/.nnnXXXXXX")
+
+if [ -s "$selection" ]; then
+ printf "Rename 'c'urrent / 's'election? "
+ read -r resp
+fi
+
+if [ "$resp" = "s" ]; then
+ arr=$(tr '\0' '\n' < "$selection")
+else
+ if [ "$INCLUDE_HIDDEN" -eq 0 ]; then
+ arr=$(find . ! -name . -prune ! -name ".*" -print | sort)
+ else
+ arr=$(find . ! -name . -prune -print | sort)
+ fi
+fi
+
+printf "%s" "$arr" | awk '{print NR " " $0}' > "$dst_file"
+
+items=("~")
+while IFS='' read -r line; do
+ items+=("$line");
+done < <(printf "%s\n" "$arr")
+
+$EDITOR "$dst_file"
+
+while read -r num name; do
+ if [ -z "$name" ]; then
+ if [ -z "$num" ]; then
+ continue
+ fi
+
+ printf "%s: unable to parse line, aborting\n" "$0"
+ exit 1
+ fi
+
+ # check if $num is an integer
+ if [ ! "$num" -eq "$num" ] 2> /dev/null; then
+ printf "%s: unable to parse line, aborting\n" "$0"
+ exit 1
+ fi
+
+ src=${items[$num]}
+
+ if [ -z "$src" ]; then
+ printf "%s: unknown item number %s\n" "$0" "$num" > /dev/stderr
+ continue
+ elif [ "$name" != "$src" ]; then
+ if [ -z "$name" ]; then
+ continue
+ fi
+
+ if [ ! -e "$src" ] && [ ! -L "$src" ]; then
+ printf "%s: %s does not exit\n" "$0" "$src" > /dev/stderr
+
+ unset "items[$num]"
+ continue
+ fi
+
+ # handle swaps
+ if [ -e "$name" ] || [ -L "$name" ]; then
+ tmp="$name~"
+ c=0
+
+ while [ -e "$tmp" ] || [ -L "$tmp" ]; do
+ c=$((c+1))
+ tmp="$tmp~$c"
+ done
+
+ if mv "$name" "$tmp"; then
+ printf "'%s' -> '%s'\n" "$name" "$tmp"
+ else
+ printf "%s: failed to rename %s to %s: %s\n" "$0" "$name" "$tmp" "$!" > /dev/stderr
+ exit_status=1
+ fi
+
+ for key in "${!items[@]}"; do
+ if [ "${items[$key]}" = "$name" ]; then
+ items[$key]="$tmp"
+ fi
+ done
+ fi
+
+ dir=$(dirname "$name")
+ if [ ! -d "$dir" ] && ! mkdir -p "$dir"; then
+ printf "%s: failed to create directory tree %s\n" "$0" "$dir" > /dev/stderr
+ exit_status=1
+ elif ! mv "$src" "$name"; then
+ printf "%s: failed to rename %s to %s: %s\n" "$0" "$name" "$tmp" "$!" > /dev/stderr
+ exit_status=1
+ else
+ if [ -d "$name" ]; then
+ for key in "${!items[@]}"; do
+ items[$key]=$(printf "%s" "${items[$key]}" | sed "s|^$src\(\$\|\/\)|$name\1|")
+ done
+
+ printf "'%s' => '%s'\n" "$src" "$name"
+ else
+ printf "'%s' -> '%s'\n" "$src" "$name"
+ fi
+ fi
+ fi
+
+ unset "items[$num]"
+done <"$dst_file"
+
+unset "items[0]"
+for item in "${items[@]}"; do
+ rm -ri "$item"
+done
+
+rm "$dst_file"
+exit $exit_status
diff --git a/plugins/batchrename b/plugins/batchrename
@@ -1,195 +0,0 @@
-#!/usr/bin/env sh
-
-# Description: An almost fully POSIX compliant batch file renamer
-#
-# Note: nnn auto-detects and invokes this plugin if available
-#
-# Capabilities:
-# 1. Basic file rename
-# 2. Detects order change
-# 3. Can move files
-# 4. Can remove files
-# 5. Switch number pairs to swap filenames
-#
-# Shell: POSIX compliant
-# Author: KlzXS
-
-EDITOR="${EDITOR:-vi}"
-TMPDIR="${TMPDIR:-/tmp}"
-INCLUDE_HIDDEN="${INCLUDE_HIDDEN:-0}"
-
-selection=${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection
-exit_status=0
-
-dst_file=$(mktemp "$TMPDIR/.nnnXXXXXX")
-
-if [ -s "$selection" ]; then
- printf "Rename 'c'urrent / 's'election? "
- read -r resp
-fi
-
-if [ "$resp" = "s" ]; then
- arr=$(tr '\0' '\n' < "$selection")
-else
- if [ "$INCLUDE_HIDDEN" -eq 0 ]; then
- arr=$(find . ! -name . -prune ! -name ".*" -print | sort)
- else
- arr=$(find . ! -name . -prune -print | sort)
- fi
-fi
-
-printf "%s" "$arr" | awk '{print NR " " $0}' > "$dst_file"
-arr=$(printf "%s" "$arr" | sed "s/'/'\\\\''/g;s/^\(.*\)$/'\1'/" | tr '\n' ' ')
-
-eval "set -- $arr"
-$EDITOR "$dst_file"
-
-while read -r num name; do
- if [ -z "$name" ]; then
- if [ -z "$num" ]; then
- continue
- fi
-
- printf "%s: unable to parse line, aborting\n" "$0"
- exit 1
- fi
-
- # check if $num is an integer
- if [ ! "$num" -eq "$num" ] 2> /dev/null; then
- printf "%s: unable to parse line, aborting\n" "$0"
- exit 1
- fi
-
- src=$(eval printf "%s" "\"\${$num}\"")
-
- if [ -z "$src" ]; then
- printf "%s: unknown item number %s\n" "$0" "$num" > /dev/stderr
- continue
- elif [ "$name" != "$src" ]; then
- if [ -z "$name" ]; then
- continue
- fi
-
- if [ ! -e "$src" ] && [ ! -L "$src" ]; then
- printf "%s: %s does not exit\n" "$0" "$src" > /dev/stderr
-
- c=1
- new_args=""
- while [ $c -le $# ]; do
- tmp=$(eval printf "%s" "\"\${$c}\"")
- if [ "$c" -eq "$num" ]; then
- new_args="$new_args ''"
- else
- if [ -z "$tmp" ]; then
- tmp="''"
- else
- tmp=$(printf "%s" "$tmp" | sed "s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
- fi
- new_args="$new_args $tmp"
- fi
- c=$((c+1))
- done
-
- eval "set -- $new_args"
- continue
- fi
-
- # handle swaps
- if [ -e "$name" ] || [ -L "$name" ]; then
- tmp="$name~"
- c=0
-
- while [ -e "$tmp" ] || [ -L "$tmp" ]; do
- c=$((c+1))
- tmp="$tmp~$c"
- done
-
- if mv "$name" "$tmp"; then
- printf "'%s' -> '%s'\n" "$name" "$tmp"
- else
- printf "%s: failed to rename %s to %s: %s\n" "$0" "$name" "$tmp" "$!" > /dev/stderr
- exit_status=1
- fi
-
- c=1
- new_args=""
- while [ $c -le $# ]; do
- item=$(eval printf "%s" "\"\${$c}\"")
- if [ "$item" = "$name" ]; then
- item=$(printf "%s" "$tmp" | sed "s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
- new_args="$new_args $item"
- else
- if [ -z "$item" ]; then
- item="''"
- else
- item=$(printf "%s" "$item" | sed "s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
- fi
- new_args="$new_args $item"
- fi
- c=$((c+1))
- done
-
- eval "set -- $new_args"
- fi
-
- dir=$(dirname "$name")
- if [ ! -d "$dir" ] && ! mkdir -p "$dir"; then
- printf "%s: failed to create directory tree %s\n" "$0" "$dir" > /dev/stderr
- exit_status=1
- elif ! mv "$src" "$name"; then
- printf "%s: failed to rename %s to %s: %s\n" "$0" "$name" "$tmp" "$!" > /dev/stderr
- exit_status=1
- else
- printf "'%s' -> '%s'\n" "$src" "$name"
- if [ -d "$name" ]; then
- c=1
- new_args=""
- while [ $c -le $# ]; do
- tmp=$(eval printf "\"\${$c}\"")
- if [ -z "$tmp" ]; then
- tmp="''"
- else
- tmp=$(printf "%s" "$tmp" | sed "s|^$src\(\$\|\/\)|$name\1|;s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
- fi
- new_args="$new_args $tmp"
- c=$((c+1))
- done
-
- eval "set -- $new_args"
- printf "'%s' => '%s'\n" "$src" "$name"
- fi
- fi
- fi
-
- c=1
- new_args=""
- while [ $c -le $# ]; do
- tmp=$(eval printf "%s" "\"\${$c}\"")
- if [ "$c" -eq "$num" ]; then
- new_args="$new_args ''"
- else
- if [ -z "$tmp" ]; then
- tmp="''"
- else
- tmp=$(printf "%s" "$tmp" | sed "s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
- fi
- new_args="$new_args $tmp"
- fi
- c=$((c+1))
- done
-
- eval "set -- $new_args"
-done <"$dst_file"
-
-c=1
-new_args=""
-while [ $c -le $# ]; do
- tmp=$(eval printf "%s" "\"\${$c}\"")
- if [ -n "$tmp" ]; then
- rm -ri "$tmp"
- fi
- c=$((c+1))
-done
-
-rm "$dst_file"
-exit $exit_status