vimv 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/env bash
  2. set -eu
  3. # Lists the current directory's files in Vim, so you can edit it and save to rename them
  4. # USAGE: vimv [file1 file2]
  5. # https://github.com/thameera/vimv
  6. declare -r FILENAMES_FILE=$(mktemp "${TMPDIR:-/tmp}/vimv.XXX")
  7. trap '{ rm -f "${FILENAMES_FILE}" ; }' EXIT
  8. if [ $# -ne 0 ]; then
  9. src=( "$@" )
  10. else
  11. IFS=$'\r\n' GLOBIGNORE='*' command eval 'src=($(ls))'
  12. fi
  13. for ((i=0;i<${#src[@]};++i)); do
  14. echo "${src[i]}" >> "${FILENAMES_FILE}"
  15. done
  16. ${EDITOR:-vi} "${FILENAMES_FILE}"
  17. IFS=$'\r\n' GLOBIGNORE='*' command eval 'dest=($(cat "${FILENAMES_FILE}"))'
  18. if (( ${#src[@]} != ${#dest[@]} )); then
  19. echo "WARN: Number of files changed. Did you delete a line by accident? Aborting.." >&2
  20. exit 1
  21. fi
  22. declare -i count=0
  23. for ((i=0;i<${#src[@]};++i)); do
  24. if [ "${src[i]}" != "${dest[i]}" ]; then
  25. mkdir -p "$(dirname "${dest[i]}")"
  26. if git ls-files --error-unmatch "${src[i]}" > /dev/null 2>&1; then
  27. git mv "${src[i]}" "${dest[i]}"
  28. else
  29. mv "${src[i]}" "${dest[i]}"
  30. fi
  31. ((++count))
  32. fi
  33. done
  34. echo "$count" files renamed.