backup-if-change/backup-if-change.sh
2022-12-22 16:53:15 +08:00

101 lines
2 KiB
Bash
Executable file

#!/usr/bin/env bash
set -o errexit
set -o errtrace
set -o nounset
function trap_err()
{
echo Exiting because error occurred in script.
}
trap trap_err ERR
HASH_TOOL="sha256sum"
INTERNEL=32
TARGET_DIR=""
FILE=""
function show_usage()
{
echo "$0 usage:"
echo " --target-dir Directory to store the backup files"
echo " --file The file to monitor"
echo " --hash-tool Tools to calculate hash of file, default sha256sum"
echo " --internel Seconds between checking file, default 32s"
}
function my_log()
{
echo "$(date --iso-8601=ns) -- $*"
}
function backup_the_file()
{
local the_file=$1
local target="${the_file}_$(date --iso-8601=seconds --reference $the_file)"
my_log "backuping the file to $target"
if [ -f "$TARGET_DIR/$target" ]
then
my_log "$target already exists, skipped."
else
cp --no-target-directory $the_file $TARGET_DIR/$target
fi
}
function main()
{
while [ "$#" -gt 1 ]
do
case "$1" in
"--target-dir")
TARGET_DIR=$2
shift
;;
"--file")
FILE=$2
shift
;;
"--hash-tool")
HASH_TOOL=$2
shift
;;
"--internel")
INTERNEL=$2
shift
;;
*)
echo unknown option: $1
show_usage
exit 1
;;
esac
shift
done
if [ -z "$FILE" -o -z "$TARGET_DIR" ]
then
echo "option(s) --file or --target-dir is unspecified."
show_usage
exit 1
fi
hash_prev=""
while [ "true" ]
do
hash_curr=$(eval "$HASH_TOOL $FILE")
if [ "$hash_prev" != "$hash_curr" ]
then
my_log "the hash now: $hash_curr"
backup_the_file $FILE
hash_prev=$hash_curr
fi
sleep "$INTERNEL"
done
}
main "$@"