kerbo_

valheim_backup.sh

Mar 17th, 2026 (edited)
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 3.68 KB | None | 0 0
  1. #!/bin/bash
  2. # Backup script for Valheim saves
  3. #
  4. # Twitter: @Kerbo_
  5.  
  6. # Colors
  7. RED="\e[0;91m"
  8. GREEN="\e[0;92m"
  9. YELLOW="\e[0;93m"
  10. NC="\e[0m"
  11.  
  12. # CHANGE ME
  13. saveDir="/home/kerbo/.local/share/Steam/userdata/8456522/892970/remote"
  14. backupDir="/data/backup/savegames/Valheim"
  15.  
  16. maxSaves=10
  17. dateString=$(date +"%Y-%m-%d_%H-%M")
  18.  
  19. if [[ ! -d "$backupDir" ]]; then
  20.     mkdir "$backupDir"
  21.     if [[ ! -d "$backupDir" ]]; then
  22.         echo "Error creating backup directory: $backupDir"
  23.         exit 1
  24.     fi
  25. fi
  26.  
  27. # characters
  28. cd "${saveDir}/characters" || exit 1
  29.  
  30. saves=(*.fch)
  31.  
  32. for save in "${saves[@]}"; do
  33.     if [[ -f "$save" && ! "$save" =~ "_auto" ]]; then
  34.         save_hash=$(md5sum "$save" | cut -d' ' -f1)
  35.         backup_file=$(ls "${backupDir}" | grep "${save}-" 2>/dev/null | tail -n1)
  36.         if [[ -n "$backup_file" ]]; then
  37.             backup="${backupDir}/${backup_file}"
  38.         else
  39.             backup=""
  40.         fi
  41.         backup_hash=""
  42.        
  43.         if [[ -n "$backup" ]]; then
  44.             backup_hash=$(md5sum "$backup" | cut -d' ' -f1)        
  45.         fi
  46.        
  47.         #echo save: $save
  48.         #echo backup: $backup
  49.         #echo save_hash: $save_hash
  50.         #echo backup_hash: $backup_hash
  51.        
  52.         if [[ "$backup_hash" == "$save_hash" ]]; then
  53.             echo -e "${GREEN}$save matches latest backup, no backup needed${NC}"
  54.         else
  55.             cp "$save" "${backupDir}/${save}-${dateString}"
  56.             RET=$?
  57.             if [[ $RET -eq 0 ]]; then
  58.                 echo -e "${YELLOW}Copied $save to ${backupDir}/${save}-${dateString}${NC}"
  59.             else
  60.                 echo -e "${RED}Error! cp returned $RET for $save${NC}"
  61.             fi
  62.         fi
  63.  
  64.         count=$(ls "${backupDir}" | grep -c "${save}-")
  65.         if [[ $count -gt $maxSaves ]]; then
  66.             let trim=($count - $maxSaves)
  67.             if [[ $trim -gt 0 ]]; then
  68.                 echo "Cleaning up $trim old backups for $save"
  69.                 ls "${backupDir}" | grep "${save}-" | head -n $trim | xargs -I SAVE rm "${backupDir}/SAVE"
  70.             fi
  71.         fi
  72.     fi
  73. done
  74.  
  75. # worlds
  76. cd "${saveDir}/worlds" || exit 1
  77.  
  78. saves=(*.db *.fwl)
  79.  
  80. for save in "${saves[@]}"; do
  81.     if [[ -f "$save" && ! "$save" =~ "_auto" ]]; then
  82.         save_hash=$(md5sum "$save" | cut -d' ' -f1)
  83.         backup_file=$(ls "${backupDir}" | grep "${save}-" 2>/dev/null | tail -n1)
  84.         if [[ -n "$backup_file" ]]; then
  85.             backup="${backupDir}/${backup_file}"
  86.         else
  87.             backup=""
  88.         fi
  89.         backup_hash=""
  90.        
  91.         if [[ -n "$backup" ]]; then
  92.             backup_hash=$(md5sum "$backup" | cut -d' ' -f1)        
  93.         fi
  94.        
  95.         #echo save: $save
  96.         #echo backup: $backup
  97.         #echo save_hash: $save_hash
  98.         #echo backup_hash: $backup_hash
  99.        
  100.         if [[ "$backup_hash" == "$save_hash" ]]; then
  101.             echo -e "${GREEN}$save matches latest backup, no backup needed${NC}"
  102.         else
  103.             cp "$save" "${backupDir}/${save}-${dateString}"
  104.             RET=$?
  105.             if [[ $RET -eq 0 ]]; then
  106.                 echo -e "${YELLOW}Copied $save to ${backupDir}/${save}-${dateString}${NC}"
  107.             else
  108.                 echo -e "${RED}Error! cp returned $RET for $save${NC}"
  109.             fi
  110.         fi
  111.  
  112.         count=$(ls "${backupDir}" | grep -c "${save}-")
  113.         if [[ $count -gt $maxSaves ]]; then
  114.             let trim=($count - $maxSaves)
  115.             if [[ $trim -gt 0 ]]; then
  116.                 echo "Cleaning up $trim old backups for $save"
  117.                 ls "${backupDir}" | grep "${save}-" | head -n $trim | xargs -I SAVE rm "${backupDir}/SAVE"
  118.             fi
  119.         fi
  120.     fi
  121. done
  122.  
Advertisement
Add Comment
Please, Sign In to add comment