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.

batchrename 3.9 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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. fi
  36. # check if $num is an integer
  37. if [ ! "$num" -eq "$num" ] 2> /dev/null; then
  38. printf "%s: unable to parse line, aborting\n" "$0"
  39. fi
  40. src=$(eval printf "%s" "\${$num}")
  41. if [ -z "$src" ]; then
  42. printf "%s: unknown item number %s\n" "$0" "$num" > /dev/stderr
  43. continue
  44. elif [ "$name" != "$src" ]; then
  45. if [ -z "$name" ]; then
  46. continue
  47. fi
  48. if [ ! -e "$src" ] && [ ! -L "$src" ]; then
  49. printf "%s: %s does not exit\n" "$0" "$src" > /dev/stderr
  50. c=1
  51. new_args=""
  52. while [ $c -le $# ]; do
  53. tmp=$(eval printf "%s" "\${$c}")
  54. if [ "$c" -eq "$num" ]; then
  55. new_args="$new_args ''"
  56. else
  57. if [ -z "$tmp" ]; then
  58. tmp="''"
  59. else
  60. tmp=$(printf %s "$tmp" | sed "s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
  61. fi
  62. new_args="$new_args $tmp"
  63. fi
  64. c=$((c+1))
  65. done
  66. eval "set -- $new_args"
  67. continue
  68. fi
  69. # handle swaps
  70. if [ -e "$name" ] || [ -L "$name" ]; then
  71. tmp="$name~"
  72. c=0
  73. while [ -e "$tmp" ] || [ -L "$tmp" ]; do
  74. c=$((c+1))
  75. tmp="$tmp~$c"
  76. done
  77. if mv "$name" "$tmp"; then
  78. printf "'%s' -> '%s'\n" "$name" "$tmp"
  79. else
  80. printf "%s: failed to rename %s to %s: %s\n" "$0" "$name" "$tmp" "$!" > /dev/stderr
  81. exit_status=1
  82. fi
  83. c=1
  84. new_args=""
  85. while [ $c -le $# ]; do
  86. item=$(eval printf "%s" "\${$c}")
  87. if [ "$item" = "$name" ]; then
  88. item=$(printf %s "$tmp" | sed "s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
  89. new_args="$new_args $item"
  90. else
  91. if [ -z "$item" ]; then
  92. item="''"
  93. else
  94. item=$(printf %s "$item" | sed "s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
  95. fi
  96. new_args="$new_args $item"
  97. fi
  98. c=$((c+1))
  99. done
  100. eval "set -- $new_args"
  101. fi
  102. dir=$(dirname "$name")
  103. if [ ! -d "$dir" ] && ! mkdir -p "$dir"; then
  104. printf "%s: failed to create directory tree %s\n" "$0" "$dir" > /dev/stderr
  105. exit_status=1
  106. elif ! mv "$src" "$name"; then
  107. printf "%s: failed to rename %s to %s: %s\n" "$0" "$name" "$tmp" "$!" > /dev/stderr
  108. exit_status=1
  109. else
  110. printf "'%s' -> '%s'\n" "$src" "$name"
  111. if [ -d "$name" ]; then
  112. c=1
  113. new_args=""
  114. while [ $c -le $# ]; do
  115. tmp=$(eval printf "\${$c}")
  116. if [ -z "$tmp" ]; then
  117. tmp="''"
  118. else
  119. tmp=$(printf "%s" "$tmp" | sed "s/^$src\(\$\|\/\)/$name\1/;s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
  120. fi
  121. new_args="$new_args $tmp"
  122. c=$((c+1))
  123. done
  124. eval "set -- $new_args"
  125. printf "'%s' => '%s'\n" "$src" "$name"
  126. fi
  127. fi
  128. fi
  129. c=1
  130. new_args=""
  131. while [ $c -le $# ]; do
  132. tmp=$(eval printf "%s" "\${$c}")
  133. if [ "$c" -eq "$num" ]; then
  134. new_args="$new_args ''"
  135. else
  136. if [ -z "$tmp" ]; then
  137. tmp="''"
  138. else
  139. tmp=$(printf %s "$tmp" | sed "s/'/'\\\\''/g;s/^\(.*\)$/'\1'/")
  140. fi
  141. new_args="$new_args $tmp"
  142. fi
  143. c=$((c+1))
  144. done
  145. eval "set -- $new_args"
  146. done <"$dst_file"
  147. c=1
  148. new_args=""
  149. while [ $c -le $# ]; do
  150. tmp=$(eval printf "%s" "\${$c}")
  151. if [ -n "$tmp" ]; then
  152. rm -ri "$tmp"
  153. fi
  154. c=$((c+1))
  155. done
  156. rm "$dst_file"
  157. exit $exit_status