My build of nnn with minor changes
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

141 líneas
2.9 KiB

  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