#!/bin/bash
# My use case:
# syncthing synchronizes ALL changes in DCIM directory on my android to PC.
# I wanted files to be copied somewhere else on my PC to stay forever, so I
# could sort them later and safely free some space on mobile without loss.
# Also I wish to have some stupid log with history of such events.

# inotify-tools package must be installed!

# CHANGE THIS PARAMETERS to ones you needed
dir_src="$HOME/Syncthing/Mobile/Camera"
dir_dest="$HOME/some/safe/place"
dir_logs="$HOME/inotifywait-cp-logs"
regexp="[0-9]{8}_[0-9]{6}.*\.(jpg|mp4|gif)"
mkdir -p "$dir_dest" "$dir_logs"

print() {
    echo -e "[`date '+%H:%M:%S'`] $*" \
    | tee -a "$dir_logs/`date '+%Y%m%d'`.log"
}

copy () {
    if [ -f "$dir_dest/$1" ]; then
        print "SKIPPED:\t$dir_dest/$1"
    else
        cp "$dir_src/$1" "$dir_dest/$1"
        print "COPIED:\t$dir_src/$1 => $dir_dest/$1"
    fi
}

print "START\t========================="

# First, try to backup files synced since last exec of this script
ls -1 "$dir_src" \
| grep -E "^${regexp}$" \
| while read filename; do copy "$filename"; done

# Next, run inotifywait against source directory with args:
# --quiet     -- print less (only print events)
# --monitor   -- don't stop after first event (like infinite loop)
# --event     -- first syncthing creates hidden file to write data into
#                then renames it according to source file name, so here
#                we listen to MOVED_TO event to catch final filename
# --format %f -- print only filename
# --include   -- filename regexp to catch event from, ensure your $regexp
#                is correct or remove line 53 to catch synced ALL files

inotifywait \
    --quiet \
    --monitor \
    --event moved_to \
    --format %f \
    --include "$regexp" \
    "$dir_src" \
    | while read filename; do copy "$filename"; done

print "FINISH\t========================="