Advertisement
kerbo_

motortown_backup.sh

Feb 18th, 2025
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.39 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # Colors
  4. RED="\e[0;91m"
  5. GREEN="\e[0;92m"
  6. YELLOW="\e[0;93m"
  7. NC="\e[0m"
  8.  
  9. # CHANGE ME
  10. saveDir="/opt/games/steam/steamapps/compatdata/1369670/pfx/drive_c/users/steamuser/AppData/Local/MotorTown/Saved/SaveGames"
  11. backupDir="/data/backup/savegames/Motor Town"
  12. maxSaves=10
  13. dateString=$(date +"%Y-%m-%d_%H-%M")
  14.  
  15. if [[ ! -d "$backupDir" ]]; then
  16.     mkdir "$backupDir"
  17.     if [[ ! -d "$backupDir" ]]; then
  18.         echo "Error creating backup directory: $backupDir"
  19.         exit 1
  20.     fi
  21. fi
  22.  
  23. cd "$saveDir" || exit 1
  24.  
  25. for folder in Characters Worlds; do
  26.     mkdir -p "${backupDir}/${folder}"
  27. done
  28.  
  29. # Characters
  30. folder=Characters
  31. cd $folder
  32. echo "Backing up ${folder}..."
  33. saves=(*.sav)
  34.  
  35. for save in "${saves[@]}"; do
  36.     if [[ -f "$save" ]]; then
  37.         #echo -e "${YELLOW}Checking hash:${NC} ${save}"
  38.         save_hash=$(md5sum "$save" | cut -d' ' -f1)
  39.         backup_file=$(ls "${backupDir}/${folder}/" | grep "${save}-" 2>/dev/null | tail -n1)
  40.         backup="${backupDir}/${folder}/${backup_file}"
  41.         backup_hash=""
  42.        
  43.         if [[ -n "$backup" ]]; then
  44.             #echo -e "${YELLOW}Checking hash:${NC} $(basename "${backup}")"
  45.             backup_hash=$(md5sum "$backup" | cut -d' ' -f1)        
  46.         fi
  47.        
  48.         #echo save: $save
  49.         #echo backup: $backup
  50.         #echo save_hash: $save_hash
  51.         #echo backup_hash: $backup_hash
  52.        
  53.         if [[ "$backup_hash" == "$save_hash" ]]; then
  54.             echo -e "${GREEN}$save matches latest backup, no backup needed${NC}"
  55.         else
  56.             cp "$save" "${backupDir}/${folder}/${save}-${dateString}"
  57.             RET=$?
  58.             if [[ $RET -eq 0 ]]; then
  59.                 echo -e "${YELLOW}Copied $save to ${backupDir}/${folder}/${save}-${dateString}${NC}"
  60.             else
  61.                 echo -e "${RED}Error! cp returned $RET for $save${NC}"
  62.             fi
  63.         fi
  64.  
  65.         count=$(ls "${backupDir}/${folder}/" | grep -c "${save}-")
  66.         if [[ $count -gt $maxSaves ]]; then
  67.             let trim=($count - $maxSaves)
  68.             if [[ $trim -gt 0 ]]; then
  69.                 echo "Cleaning up $trim old backups for $save"
  70.                 ls "${backupDir}/${folder}/" | grep "${save}-" | tail -n $trim | xargs -I SAVE rm "${backupDir}/${folder}/SAVE"
  71.             fi
  72.         fi
  73.     fi
  74. done
  75. cd ..
  76.  
  77. # Worlds
  78. folder=Worlds
  79. cd $folder
  80. echo "Backing up ${folder}..."
  81. worlds="$(ls -l | awk '/^d/ {print $NF}')"
  82. for world in "${worlds[@]}"; do
  83.     mkdir -p "${backupDir}/Worlds/${world}"
  84.     echo World: $world
  85.     cd $world
  86.     saves=(*.world)
  87.  
  88.     for save in "${saves[@]}"; do
  89.         if [[ -f "$save" ]]; then
  90.             #echo -e "${YELLOW}Checking hash:${NC} ${save}"
  91.             save_hash=$(md5sum "$save" | cut -d' ' -f1)
  92.             backup_file=$(ls "${backupDir}/${folder}/${world}/" | grep "${save}-" 2>/dev/null | tail -n1)
  93.             backup="${backupDir}/${folder}/${world}/${backup_file}"
  94.             backup_hash=""
  95.            
  96.             if [[ -n "$backup" ]]; then
  97.                 #echo -e "${YELLOW}Checking hash:${NC} $(basename "${backup}")"
  98.                 backup_hash=$(md5sum "$backup" | cut -d' ' -f1)        
  99.             fi
  100.            
  101.             #cho save: $save
  102.             #echo backup: $backup
  103.             #echo save_hash: $save_hash
  104.             #echo backup_hash: $backup_hash
  105.            
  106.             if [[ "$backup_hash" == "$save_hash" ]]; then
  107.                 echo -e "${GREEN}$save matches latest backup, no backup needed${NC}"
  108.             else
  109.                 cp "$save" "${backupDir}/${folder}/${world}/${save}-${dateString}"
  110.                 RET=$?
  111.                 if [[ $RET -eq 0 ]]; then
  112.                     echo -e "${YELLOW}Copied $save to ${backupDir}/${folder}/${world}/${save}-${dateString}${NC}"
  113.                 else
  114.                     echo -e "${RED}Error! cp returned $RET for $save${NC}"
  115.                 fi
  116.             fi
  117.  
  118.             count=$(ls "${backupDir}/${folder}/${world}/" | grep -c "${save}-")
  119.             if [[ $count -gt $maxSaves ]]; then
  120.                 let trim=($count - $maxSaves)
  121.                 if [[ $trim -gt 0 ]]; then
  122.                     echo "Cleaning up $trim old backups for $save"
  123.                     ls "${backupDir}/${folder}/${world}/" | grep "${save}-" | tail -n $trim | xargs -I SAVE rm "${backupDir}/${folder}/${world}/SAVE"
  124.                 fi
  125.             fi
  126.         fi
  127.     done
  128.     cd ..
  129. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement