My build of nnn with minor changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

преди 5 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #!/usr/bin/env sh
  2. # Description: An almost fully POSIX compliant batch file renamer
  3. #
  4. # Note: nnn auto-detects and invokes this plugin if available
  5. #
  6. # Capabilities:
  7. # 1. Basic file rename
  8. # 2. Detects order change
  9. # 3. Can move files
  10. # 4. Can remove files
  11. # 5. Switch number pairs to swap filenames
  12. #
  13. # Shell: POSIX compliant
  14. # Author: KlzXS
  15. EDITOR="${EDITOR:-vi}"
  16. TMPDIR="${TMPDIR:-/tmp}"
  17. INCLUDE_HIDDEN="${INCLUDE_HIDDEN:-0}"
  18. selection=${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection
  19. exit_status=0
  20. dst_file=$(mktemp "$TMPDIR/.nnnXXXXXX")
  21. if [ -s "$selection" ]; then
  22. printf "Rename 'c'urrent / 's'election? "
  23. read -r resp
  24. fi
  25. if [ "$resp" = "s" ]; then
  26. arr=$(tr '\0' '\n' < "$selection")
  27. else
  28. if [ "$INCLUDE_HIDDEN" -eq 0 ]; then
  29. arr=$(find . ! -name . -prune ! -name ".*" -print | sort)
  30. else
  31. arr=$(find . ! -name . -prune -print | sort)
  32. fi
  33. fi
  34. printf "%s" "$arr" | awk '{print NR " " $0}' > "$dst_file"
  35. arr=$(printf "%s" "$arr" | sed "s/'/'\\\\''/g;s/^\(.*\)$/'\1'/" | tr '\n' ' ')
  36. eval "set -- $arr"
  37. $EDITOR "$dst_file"
  38. while read -r num name; do
  39. if [ -z "$name" ]; then
  40. if [ -z "$num" ]; then
  41. continue
  42. fi
  43. printf "%s: unable to parse line, aborting\n" "$0"
  44. exit 1
  45. fi
  46. # check if $num is an integer
  47. if [ ! "$num" -eq "$num" ] 2> /dev/null; then
  48. printf "%s: unable to parse line, aborting\n" "$0"
  49. exit 1
  50. fi
  51. src=$(eval printf "%s" "\"\${$num}\"")
  52. if [ -z "$src" ]; then
  53. printf "%s: unknown item number %s\n" "$0" "$num" > /dev/stderr
  54. continue
  55. elif [ "$name" != "$src" ]; then
  56. if [ -z "$name" ]; then
  57. continue
  58. fi
  59. if [ ! -e "$src" ] && [ ! -L "$src" ]; then
  60. printf "%s: %s does not exit\n" "$0" "$src" > /dev/stderr
  61. c=1
  62. new_args=""
  63. while [ $c -le $# ]; do
  64. tmp=$(eval printf "%s" "\"\${$c}\"")
  65. if [ "$c" -eq "$num" ]; then
  66. new_args="$new_args ''"
  67. else
  68. if [ -z "$tmp" ]; then
  69. tmp="''"
  70. else
  71. tmp=$(printf "%s" "$tmp" | sed "s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
  72. fi
  73. new_args="$new_args $tmp"
  74. fi
  75. c=$((c+1))
  76. done
  77. eval "set -- $new_args"
  78. continue
  79. fi
  80. # handle swaps
  81. if [ -e "$name" ] || [ -L "$name" ]; then
  82. tmp="$name~"
  83. c=0
  84. while [ -e "$tmp" ] || [ -L "$tmp" ]; do
  85. c=$((c+1))
  86. tmp="$tmp~$c"
  87. done
  88. if mv "$name" "$tmp"; then
  89. printf "'%s' -> '%s'\n" "$name" "$tmp"
  90. else
  91. printf "%s: failed to rename %s to %s: %s\n" "$0" "$name" "$tmp" "$!" > /dev/stderr
  92. exit_status=1
  93. fi
  94. c=1
  95. new_args=""
  96. while [ $c -le $# ]; do
  97. item=$(eval printf "%s" "\"\${$c}\"")
  98. if [ "$item" = "$name" ]; then
  99. item=$(printf "%s" "$tmp" | sed "s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
  100. new_args="$new_args $item"
  101. else
  102. if [ -z "$item" ]; then
  103. item="''"
  104. else
  105. item=$(printf "%s" "$item" | sed "s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
  106. fi
  107. new_args="$new_args $item"
  108. fi
  109. c=$((c+1))
  110. done
  111. eval "set -- $new_args"
  112. fi
  113. dir=$(dirname "$name")
  114. if [ ! -d "$dir" ] && ! mkdir -p "$dir"; then
  115. printf "%s: failed to create directory tree %s\n" "$0" "$dir" > /dev/stderr
  116. exit_status=1
  117. elif ! mv "$src" "$name"; then
  118. printf "%s: failed to rename %s to %s: %s\n" "$0" "$name" "$tmp" "$!" > /dev/stderr
  119. exit_status=1
  120. else
  121. printf "'%s' -> '%s'\n" "$src" "$name"
  122. if [ -d "$name" ]; then
  123. c=1
  124. new_args=""
  125. while [ $c -le $# ]; do
  126. tmp=$(eval printf "\"\${$c}\"")
  127. if [ -z "$tmp" ]; then
  128. tmp="''"
  129. else
  130. tmp=$(printf "%s" "$tmp" | sed "s|^$src\(\$\|\/\)|$name\1|;s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
  131. fi
  132. new_args="$new_args $tmp"
  133. c=$((c+1))
  134. done
  135. eval "set -- $new_args"
  136. printf "'%s' => '%s'\n" "$src" "$name"
  137. fi
  138. fi
  139. fi
  140. c=1
  141. new_args=""
  142. while [ $c -le $# ]; do
  143. tmp=$(eval printf "%s" "\"\${$c}\"")
  144. if [ "$c" -eq "$num" ]; then
  145. new_args="$new_args ''"
  146. else
  147. if [ -z "$tmp" ]; then
  148. tmp="''"
  149. else
  150. tmp=$(printf "%s" "$tmp" | sed "s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
  151. fi
  152. new_args="$new_args $tmp"
  153. fi
  154. c=$((c+1))
  155. done
  156. eval "set -- $new_args"
  157. done <"$dst_file"
  158. c=1
  159. new_args=""
  160. while [ $c -le $# ]; do
  161. tmp=$(eval printf "%s" "\"\${$c}\"")
  162. if [ -n "$tmp" ]; then
  163. rm -ri "$tmp"
  164. fi
  165. c=$((c+1))
  166. done
  167. rm "$dst_file"
  168. exit $exit_status