3 # Date: 2020-04-08T23:37Z
5 # Description: A bash script that hashes files immediately after they
6 # are modified. Watches for 1 hour then exits.
8 # Dependencies: inotifywait, timeout, awk, b2sum, date
10 echoerr
() { echo "$@" 1>&2; }
12 DIR_TO_WATCH
="/home/baltakatei/Sync"
13 DIR_LOG
="/home/baltakatei/Sync/kodawkuori-07/2020/archive-PERS/logs/files"
15 DIR_LOG_PATH
=$DIR_LOG"/""$(date +%Y%m%d)""..""$(hostname)""_""$DIGEST_ALGO""_filewrites.log" # The .log extension is important for inotifywait "--exclude" option.
16 TIMEOUT
="1h" # Limit inotifywait process to 1 hour.
17 MIN_FILE_SIZE
=1 # smallest file size to log (in bytes)
19 if ! command -v "$DIGEST_ALGO" 1>/dev
/null
2>/dev
/null
; then echoerr
"ERROR: $0 could not find command $DIGEST_ALGO ."; exit 1; fi
21 if [ ! -d "$DIR_TO_WATCH" ]; then echoerr
"ERROR: $0 could not parse $DIR_TO_WATCH as directory."; exit 1; fi
23 timeout
$TIMEOUT inotifywait
-m -e close_write
-e moved_to
--exclude ".tmp$" --exclude ".log$" -r --format "%w%f" "$DIR_TO_WATCH" |
25 # note: make sure to exclude the $DIR_LOG_PATH via ".log$" (or equivalent means) to avoid endless logging of log writes.
26 EVENT_DATE
="$(date +%Y%m%dT%H%M%S.%N%z )"
27 TARGET_FILEPATH
="$(echo -n $line )"
28 TARGET_FILENAME
="$(basename "$TARGET_FILEPATH" )"
29 TARGET_FILESIZE
="$(du -b "$TARGET_FILEPATH" | awk '{print $1}' )"
30 TARGET_FILEMTIME
="$(date -r "$TARGET_FILEPATH" +%Y%m%dT%H%M%S.%N%z)"
31 TARGET_DIGEST
="$(cat "$TARGET_FILEPATH" | $DIGEST_ALGO | awk '{print $1}' )"
32 EVENT_LOG_ENTRY
="$EVENT_DATE","$TARGET_FILEMTIME","$DIGEST_ALGO","$TARGET_DIGEST","$TARGET_FILESIZE","$TARGET_FILEPATH"
33 echo "$EVENT_LOG_ENTRY" >> /dev
/random
# Mix written file's digest with system PRNG.
34 if [ -d "$DIR_LOG" ] && [ $
(( "$TARGET_FILESIZE" - "$MIN_FILE_SIZE" )) -ge 0 ]; then
35 if [ ! -f "$DIR_LOG_PATH" ]; then
36 echo "EVENT_DATE,TARGET_FILEMTIME,DIGEST_ALGO,TARGET_DIGEST,TARGET_FILESIZE,TARGET_FILEPATH" >> "$DIR_LOG_PATH" # print field names in first row
38 echo "$EVENT_LOG_ENTRY" >> "$DIR_LOG_PATH"; # Log written file's digest if TARGET_FILESIZE greater or equal to MIN_FILE_SIZE (in bytes).
39 #echo "$EVENT_LOG_ENTRY" >> /tmp/bkhashwatch.log #debug
42 echo "Timeout of $TIMEOUT elapsed. Exiting."