I have a script which does incremental backups with rsync (script 1). I tried to add the feature to continue unfinished jobs in another script (script 2) but this version does a full copy of the source instead of doing incremental backup. What am I doing wrong? Here are the scripts:
script 1
#!/bin/zsh
readonly VOLUME_NAME="bckp_HD"
readonly SOURCE_DIR="/home/${USER}/srcdir"
readonly BACKUP_DIR="/media/${USER}/${VOLUME_NAME}/rsync_snapshots"
readonly DATETIME="$(date '+%Y_%m_%dT%H_%M_%S')"
readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}${SOURCE_DIR}"
readonly LATEST_LINK="${BACKUP_DIR}/latest${SOURCE_DIR}"
readonly LOG_DIR="${HOME}/logs/rsync_log"
readonly LOG_FILE="${LOG_DIR}/${VOLUME_NAME}_${DATETIME}.log"
# Define the excluded paths
EXCLUDES=(
"--exclude=.cache"
)
# Cleanup function
cleanup() {
rm -f "$LOCK_FILE"
}
if [[ ! -d "${BACKUP_DIR}" ]]; then
mkdir -p "${BACKUP_DIR}"
fi
if [[ ! -d "${LOG_DIR}" ]]; then
mkdir -p "${LOG_DIR}"
fi
rsync -auv --delete --mkpath \
"${SOURCE_DIR}/" \
--link-dest "${LATEST_LINK}" \
"${EXCLUDES[@]}" \
--log-file="${LOG_FILE}" \
"${BACKUP_PATH}"
rm -rf "${BACKUP_DIR}/latest"
ln -s "${DATETIME}" "${BACKUP_DIR}/latest"
script 2 (same as script 1 until line 29):
#!/bin/zsh
readonly VOLUME_NAME="bckp_HD"
readonly SOURCE_DIR="/home/${USER}/srcdir"
readonly BACKUP_DIR="/media/${USER}/${VOLUME_NAME}/rsync_snapshots"
readonly DATETIME="$(date '+%Y_%m_%dT%H_%M_%S')"
readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}${SOURCE_DIR}"
readonly LATEST_LINK="${BACKUP_DIR}/latest${SOURCE_DIR}"
readonly LOG_DIR="${HOME}/logs/rsync_log"
readonly LOG_FILE="${LOG_DIR}/${VOLUME_NAME}_${DATETIME}.log"
readonly LOCK_FILE="${BACKUP_DIR}/.backup_in_progress"
# Define the excluded paths
EXCLUDES=(
"--exclude=.cache"
)
# Cleanup function
cleanup() {
rm -f "$LOCK_FILE"
}
if [[ ! -d "${BACKUP_DIR}" ]]; then
mkdir -p "${BACKUP_DIR}"
fi
if [[ ! -d "${LOG_DIR}" ]]; then
mkdir -p "${LOG_DIR}"
fi
# Handle unfinished backup
if [[ -f "${LOCK_FILE}" ]]; then
echo "Found an unfinished backup. Resuming..."
UNFINISHED_BACKUP_PATH=$(cat "$LOCK_FILE")
rsync -auv --progress --mkpath \
"${SOURCE_DIR}/" \
--link-dest="${LATEST_LINK}" \
"${EXCLUDES[@]}" \
--log-file="${LOG_FILE}" \
"${UNFINISHED_BACKUP_PATH}"
cleanup
else
echo "${BACKUP_PATH}" > "${LOCK_FILE}"
# If latest snapshot exists, do incremental
if [[ -L "${LATEST_LINK}" ]]; then
rsync -auv --progress --mkpath \
"${SOURCE_DIR}/" \
--link-dest="${LATEST_LINK}" \
"${EXCLUDES[@]}" \
--log-file="${LOG_FILE}" \
"${BACKUP_PATH}"
else
echo "No previous backup found. Running full backup."
rsync -auv --progress --mkpath \
"${SOURCE_DIR}/" \
"${EXCLUDES[@]}" \
--log-file="${LOG_FILE}" \
"${BACKUP_PATH}"
fi
echo "Clean up the lock file"
cleanup
fi
# Update the latest symlink
rm -rf "${BACKUP_DIR}/latest"
ln -s "${DATETIME}" "${BACKUP_DIR}/latest"