Advertisement
fant0men

lc_ext.sh

Oct 18th, 2020 (edited)
2,081
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 1.35 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # The purpose of this script is to find all (PDF) files in the directory
  4. # specified and turn the file extension to lowercase. If another file
  5. # already has the new name, check its MD5 hash to see if it's an
  6. # identical file, and if so delete it. Also delete files with any name
  7. # that have identical MD5 hashes to other files in the directory.
  8.  
  9. set -eo pipefail
  10.  
  11. usage () {
  12.     printf '\n%s\n\n' "Usage: $(basename "$0") [dir]"
  13.     exit
  14. }
  15.  
  16. if [[ -z $1 || ! -d $1 ]]; then
  17.     usage
  18. fi
  19.  
  20. declare -A regex md5s
  21.  
  22. regex[fn]='^(.*)\.([^.]*)$'
  23.  
  24. dir=$(readlink -f "$1")
  25.  
  26. mapfile -t files < <(find "$dir" -type f -iname "*.pdf")
  27.  
  28. for (( i = 0; i < ${#files[@]}; i++ )); do
  29.     f="${files[${i}]}"
  30.     f_bn=$(basename "$f")
  31.  
  32.     if [[ ! $f =~ ${regex[fn]} ]]; then
  33.         continue
  34.     fi
  35.  
  36.     no_ext="${BASH_REMATCH[1]}"
  37.     ext="${BASH_REMATCH[2]}"
  38.     lc_ext="${ext,,}"
  39.  
  40.     new_f="${no_ext}.${lc_ext}"
  41.     new_f_bn=$(basename "$new_f")
  42.  
  43.     f_md5=$(md5sum -b "$f")
  44.     f_md5="${f_md5%% *}"
  45.  
  46.     if [[ -z ${md5s[${f_md5}]} ]]; then
  47.         md5s["${f_md5}"]=1
  48.     else
  49.         printf '%s\n' "rm: ${f}"
  50.         rm "$f"
  51.  
  52.         continue
  53.     fi
  54.  
  55.     if [[ $f != "$new_f" ]]; then
  56.         if [[ -f $new_f ]]; then
  57.             new_f_md5=$(md5sum -b "$new_f")
  58.             new_f_md5="${new_f_md5%% *}"
  59.  
  60.             if [[ $f_md5 != "$new_f_md5" ]]; then
  61.                 continue
  62.             fi
  63.         fi
  64.  
  65.         printf '%s\n' "mv: ${new_f}"
  66.         mv "$f" "$new_f"
  67.     fi
  68. done
  69.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement