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