#########################################################################
# This command makes a backup copy of a given directory into a backup
-# directory, tags it with the date and time, and uses rsync
-# intelligent features to avoid making superfluous copies of files
-# which are already backuped.
+# directory, tags it with the date and time, and uses rsync smart use
+# of hard links to avoid unnecessary duplicates of files already
+# backuped.
set -e
-[[ ${FREEZE_DIR} ]] || FREEZE_DIR=${HOME}/.backups
+# The default directory does not start with a period, as it may be
+# huge and should not be "hidden" from the user.
+
+[[ ${FREEZE_DIR} ]] || FREEZE_DIR=${HOME}/freezer
if [[ ! -d ${FREEZE_DIR} ]]; then
echo "Can not find directory ${FREEZE_DIR}" >&2
fi
while [[ "$1" ]]; do
-
- dir=$(basename "$1")
- path=$(dirname "$1")
+ real_path="$(realpath "$1")"
+ dir=$(basename "${real_path}")
+ path=$(dirname "${real_path}")
full_path="${path}/${dir}"
date=$(date +%Y_%b_%d_%H:%M:%S)
new_backup="${backup}:::${date}"
if [[ -h "${current_backup}" ]]; then
- rsync --link-dest="${current_backup}/" -axz "${full_path}/" "${new_backup}/"
- rm -f "${current_backup}"
+ rsync --progress --link-dest="${current_backup}/" -axz "${full_path}/" "${new_backup}/"
+ rm "${current_backup}"
else
if [[ -a ${current_backup} ]]; then
echo "${current_backup} exists and is not a symbolic link" >&2
exit 1
else
- rsync -axz "${full_path}/" "${new_backup}/"
+ rsync --progress -axz "${full_path}/" "${new_backup}/"
fi
fi
- ln -s "${new_backup}" "${current_backup}"
+ ln -vs "${new_backup}" "${current_backup}"
sync