#!/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 "$@"