My build of nnn with minor changes
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 
 

187 рядки
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