Files
homelab-configs/owncloud/organize_photos.sh
T

73 lines
2.1 KiB
Bash
Executable File

#!/usr/bin/env bash
BASE="/mnt/INTEL-SSD/ownCloud - Joe Gitta@cloud.jgitta.com/Personal/InstantUpload"
UNSORTED="$BASE/_unsorted"
LOG="/var/log/organize_photos.log"
moved=0; skipped=0; unsorted=0; errors=0
echo "=== $(date +%Y-%m-%d\ %H:%M:%S) Starting ===" >> "$LOG"
ts_to_ym() {
local ts_ms="$1"
local ts_s=$(( ts_ms / 1000 ))
date -d "@$ts_s" "+%Y %m" 2>/dev/null
}
get_ym() {
local f="$1"
local b
b=$(basename "$f")
if [[ "$b" =~ (^|[^0-9])([0-9]{4})(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01]) ]]; then
echo "${BASH_REMATCH[2]} ${BASH_REMATCH[3]}"; return
fi
if [[ "$b" =~ ([0-9]{4})[-_](0[1-9]|1[0-2])[-_](0[1-9]|[12][0-9]|3[01]) ]]; then
echo "${BASH_REMATCH[1]} ${BASH_REMATCH[2]}"; return
fi
if [[ "$b" =~ (^|[^0-9])([0-9]{13})([^0-9]|$) ]]; then
ts_to_ym "${BASH_REMATCH[2]}"; return
fi
if [[ "$b" =~ ^([0-9]{2})_([0-9]{2})_([0-9]{4})_ ]]; then
echo "${BASH_REMATCH[3]} ${BASH_REMATCH[1]}"; return
fi
echo ""
}
move_file() {
local src="$1"
local root="$2"
local fname
fname=$(basename "$src")
local ym
ym=$(get_ym "$src")
if [[ -z "$ym" ]]; then
mkdir -p "$UNSORTED"
if [[ ! -e "$UNSORTED/$fname" ]]; then
mv "$src" "$UNSORTED/$fname" && ((unsorted++)) || ((errors++))
else
((skipped++))
fi
return
fi
local year month dest_dir dest
year=$(echo "$ym" | cut -d' ' -f1)
month=$(echo "$ym" | cut -d' ' -f2)
dest_dir="$root/$year/$year-$month"
dest="$dest_dir/$fname"
mkdir -p "$dest_dir"
if [[ -e "$dest" ]]; then
((skipped++)); return
fi
mv "$src" "$dest" && ((moved++)) || { echo " ERROR: $fname" >> "$LOG"; ((errors++)); }
}
for SUBDIR in Camera BlueIris Facebook scans EufyVideoDir; do
SUBPATH="$BASE/$SUBDIR"
[[ -d "$SUBPATH" ]] || continue
while IFS= read -r -d '' f; do
move_file "$f" "$SUBPATH"
done < <(find "$SUBPATH" -maxdepth 1 -type f -print0)
done
echo " Moved: $moved Unsorted: $unsorted Skipped: $skipped Errors: $errors" >> "$LOG"
echo "=== Done ===" >> "$LOG"