restore_archive_backup.sh 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #!/bin/sh
  2. # Default values
  3. DRY_RUN=0
  4. REMOTE_BACKUP="" # Mandatory - your external backup location
  5. LOCAL_SOURCE="" # Default: current directory
  6. RECOVERY_DIR="$HOME/archive-pictures" # Where to restore missing files
  7. show_help() {
  8. echo "Usage: $0 [OPTIONS] REMOTE_BACKUP [LOCAL_SOURCE] [RECOVERY_DIR]"
  9. echo "Recover files missing in LOCAL_SOURCE from REMOTE_BACKUP to RECOVERY_DIR"
  10. echo ""
  11. echo "Options:"
  12. echo " -n Dry run: show what would be copied"
  13. echo " -h Show this help message"
  14. echo ""
  15. echo "Examples:"
  16. echo " $0 -n /media/backup/photos ~/Photos ~/recovered-photos"
  17. echo " $0 /media/backup/photos ~/Photos"
  18. echo " $0 /media/backup/photos"
  19. exit 0
  20. }
  21. # Process options
  22. while getopts "nh" opt; do
  23. case $opt in
  24. n) DRY_RUN=1;;
  25. h) show_help;;
  26. *) show_help;;
  27. esac
  28. done
  29. shift $((OPTIND-1))
  30. # Assign positional parameters
  31. [ $# -ge 1 ] && REMOTE_BACKUP="$1"
  32. [ $# -ge 2 ] && LOCAL_SOURCE="$2"
  33. [ $# -ge 3 ] && RECOVERY_DIR="$3"
  34. # Validations
  35. if [ -z "$REMOTE_BACKUP" ]; then
  36. echo "Error: You must specify the remote backup directory" >&2
  37. show_help
  38. exit 1
  39. fi
  40. if [ ! -d "$REMOTE_BACKUP" ]; then
  41. echo "Error: Remote backup directory doesn't exist: $REMOTE_BACKUP" >&2
  42. exit 1
  43. fi
  44. if [ ! -d "$LOCAL_SOURCE" ]; then
  45. echo "Error: Local source directory doesn't exist: $LOCAL_SOURCE" >&2
  46. exit 1
  47. fi
  48. # Display configuration
  49. echo "Configuration:"
  50. echo " Remote Backup: $REMOTE_BACKUP"
  51. echo " Local Source: $LOCAL_SOURCE"
  52. echo " Recovery Dir: $RECOVERY_DIR"
  53. [ $DRY_RUN -eq 1 ] && echo " Mode: Dry Run (-n enabled)"
  54. # Find and recover missing files
  55. find "$REMOTE_BACKUP" -type f | while read -r backup_file; do
  56. # Get relative path
  57. rel_path="${backup_file#$REMOTE_BACKUP/}"
  58. local_file="$LOCAL_SOURCE/$rel_path"
  59. recovery_file="$RECOVERY_DIR/$rel_path"
  60. # If file is missing in local source
  61. if [ ! -e "$local_file" ]; then
  62. if [ $DRY_RUN -eq 1 ]; then
  63. # Dry run: just show
  64. echo "[Dry Run] Would recover: $backup_file -> $recovery_file"
  65. else
  66. # Actual recovery: create parent dirs and copy
  67. mkdir -p "$(dirname "$recovery_file")"
  68. cp -v "$backup_file" "$recovery_file"
  69. fi
  70. fi
  71. done
  72. # Final summary
  73. if [ $DRY_RUN -eq 1 ]; then
  74. echo "Dry run completed. No files were actually modified."
  75. else
  76. echo "Recovery completed. Missing files copied to $RECOVERY_DIR"
  77. fi