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.
 
 
 
 
 
 

187 lignes
3.9 KiB

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