My build of nnn with minor changes
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

196 lignes
4.1 KiB

  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