Advertisement
PastersGonnaPaste

batch renamer

Mar 15th, 2013
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 1.77 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. function mvi {
  4.  
  5.     function do_edit {
  6.         ${EDITOR:-vi} "${newnames}"
  7.     }
  8.  
  9.     function review {
  10.         local -a LINESA LINESB
  11.         local oldlines=$(wc -l < "${oldnames}")
  12.         local newlines=$(wc -l < "${newnames}")
  13.         if (( oldlines != newlines )); then
  14.             echo "error: filenames count mismatch found, aborting..." >&2
  15.             return 1
  16.         fi
  17.         if egrep -q -e '^$' "${newnames}"; then
  18.             echo "error: found empty lines in input, aborting..." >&2
  19.             return 1
  20.         fi
  21.         echo "Please carefully review the filename changes."
  22.         echo "Hit enter when ready..."
  23.         read -n 1 -s placebo
  24.         while read line; do
  25.             LINESA[${#LINESA[@]}]="${line}"
  26.         done < "${oldnames}"
  27.         while read line; do
  28.             LINESB[${#LINESB[@]}]="${line}"
  29.         done < "${newnames}"
  30.         for ((i=0; i<${#LINESA[@]}; i++)); do
  31.             if [[ "${LINESA[i]}" != "${LINESB[i]}" ]]; then
  32.                 echo "${LINESA[i]} -> ${LINESB[i]}"
  33.                 DIFFLINES[${#DIFFLINES[@]}]="${LINESA[i]}"
  34.                 DIFFLINES[${#DIFFLINES[@]}]="${LINESB[i]}"
  35.             fi
  36.         done > "${tmpnames}"
  37.         ${PAGER:-more} < "${tmpnames}"
  38.     }
  39.  
  40.     function confirmation {
  41.         echo "Are you sure you want to renames the files like this? [y/n]"
  42.         read -n 1 -s answer
  43.         case ${answer} in
  44.             [yY]) return 0 ;;
  45.             *) return 1 ;;
  46.         esac
  47.     }
  48.  
  49.     function cancel {
  50.         echo "Re[e]dit or [a]bort?"
  51.         read -n 1 -s answer
  52.         case ${answer} in
  53.             [eE]) return 1 ;;
  54.             *) return 0 ;;
  55.         esac
  56.     }
  57.  
  58.     function execute {
  59.         for ((i=0; i<${#DIFFLINES[@]}; i+=2)); do
  60.             echo "mv \"${DIFFLINES[i]}\" \"${DIFFLINES[i+1]}\""
  61.         done
  62.     }
  63.  
  64.     local oldnames=$(mktemp) newnames=$(mktemp) tmpnames=$(mktemp)
  65.     local -a DIFFLINES
  66.  
  67.     ls -1 >"${oldnames}"
  68.     cp "${oldnames}" "${newnames}"
  69.  
  70.     while do_edit; do
  71.         review
  72.         confirmation && execute || cancel && break
  73.     done
  74.  
  75.     # cleanup
  76.     rm "${oldnames}" "${newnames}"
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement