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.

.nmv 2.9 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #!/usr/bin/env bash
  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: bash
  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. if ! [ "$resp" = "c" ] && ! [ "$resp" = "s" ]; then
  25. exit 1
  26. fi
  27. fi
  28. if [ "$resp" = "s" ]; then
  29. arr=$(tr '\0' '\n' < "$selection")
  30. else
  31. if [ "$INCLUDE_HIDDEN" -eq 0 ]; then
  32. arr=$(find . ! -name . -prune ! -name ".*" -print | sort)
  33. else
  34. arr=$(find . ! -name . -prune -print | sort)
  35. fi
  36. fi
  37. printf "%s" "$arr" | awk '{print NR " " $0}' > "$dst_file"
  38. items=("~")
  39. while IFS='' read -r line; do
  40. items+=("$line");
  41. done < <(printf "%s\n" "$arr")
  42. $EDITOR "$dst_file"
  43. while read -r num name; do
  44. if [ -z "$name" ]; then
  45. if [ -z "$num" ]; then
  46. continue
  47. fi
  48. printf "%s: unable to parse line, aborting\n" "$0"
  49. exit 1
  50. fi
  51. # check if $num is an integer
  52. if [ ! "$num" -eq "$num" ] 2> /dev/null; then
  53. printf "%s: unable to parse line, aborting\n" "$0"
  54. exit 1
  55. fi
  56. src=${items[$num]}
  57. if [ -z "$src" ]; then
  58. printf "%s: unknown item number %s\n" "$0" "$num" > /dev/stderr
  59. continue
  60. elif [ "$name" != "$src" ]; then
  61. if [ -z "$name" ]; then
  62. continue
  63. fi
  64. if [ ! -e "$src" ] && [ ! -L "$src" ]; then
  65. printf "%s: %s does not exit\n" "$0" "$src" > /dev/stderr
  66. unset "items[$num]"
  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. for key in "${!items[@]}"; do
  84. if [ "${items[$key]}" = "$name" ]; then
  85. items[$key]="$tmp"
  86. fi
  87. done
  88. fi
  89. dir=$(dirname "$name")
  90. if [ ! -d "$dir" ] && ! mkdir -p "$dir"; then
  91. printf "%s: failed to create directory tree %s\n" "$0" "$dir" > /dev/stderr
  92. exit_status=1
  93. elif ! mv "$src" "$name"; then
  94. printf "%s: failed to rename %s to %s: %s\n" "$0" "$name" "$tmp" "$!" > /dev/stderr
  95. exit_status=1
  96. else
  97. if [ -d "$name" ]; then
  98. for key in "${!items[@]}"; do
  99. items[$key]=$(printf "%s" "${items[$key]}" | sed "s|^$src\(\$\|\/\)|$name\1|")
  100. done
  101. printf "'%s' => '%s'\n" "$src" "$name"
  102. else
  103. printf "'%s' -> '%s'\n" "$src" "$name"
  104. fi
  105. fi
  106. fi
  107. unset "items[$num]"
  108. done <"$dst_file"
  109. unset "items[0]"
  110. for item in "${items[@]}"; do
  111. rm -ri "$item"
  112. done
  113. rm "$dst_file"
  114. exit $exit_status