My build of nnn with minor changes
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

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