#!/bin/bash # @author 6543 # @version 1.1 # @date 2019-05-11 ## Options/Parameter # [$1]: #load functions from LIB if [ -f "$(readlink -f "$(dirname $0)/bash-lib")" ]; then source "$(readlink -f "$(dirname $0)/bash-lib")" [ $DEBUG == $TRUE ] && echo "LIB VERSION: $LIBVER" >&2 elif [ -f "/bash-lib" ]; then source "/bash-lib" [ $DEBUG == $TRUE ] && echo "LIB VERSION: $LIBVER" >&2 else echo "ERROR: Global Lib not found" exit 255 fi #get options & args readonly mode=$(echo $1 | tr -d '-') [ -n "$1" ] && [ -d "$1" ] && moviedir="$1" readonly DATE=$(date '+%Y-%m-%d') #help function [ "$mode" == "help" ] && { #help menue echo "$0 is part of the TerabyteTerminator Project" echo "" echo "update-file-state (moviedir)" echo "config: $globalconf" exit 0 } #load config (DB,...) config_load ########################### ## Programm Haupt Ablauf ## ########################### function main() { #clean DB from old stuff { db_query "DELETE From File WHERE (Size=0 OR Size IS NULL OR MD5='' OR MD5 IS NULL OR Name='') AND (TTSync=$TTSYNC_EXIST OR TTSync=$TTSYNC_BACKUP);" db_query "DELETE FROM File WHERE Folder LIKE 'Clone/%' OR Folder LIKE '.Trash-%';" #find dublicates ! #Solve SQL ERROR: "Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='" #find | while read line; do DIR="$(dirname "$line")"; File="$(basename "$line")"; mv -v "$DIR/$File" "$DIR/$(echo "$File" | tr -cd '[:alnum:][:blank:]_.-' | tr '[:blank:]' ' ' | sed 's/\ \ /\ /g')"; done } #erselle zwei dateilisten list_tmp=$(mktemp -d) db_query "SELECT CONCAT('$moviedir/', Folder, '/', Name) FROM File WHERE TTSync=$TTSYNC_EXIST OR TTSync=$TTSYNC_BACKUP;" > "$list_tmp/indb" find "$moviedir" -type f -size +1k | grep -v '/Clone/' | grep -v '/.Trash-' > "$list_tmp/exist" #find new files grep -vf "$list_tmp/indb" "$list_tmp/exist" > "$list_tmp/new" #all IDs wich an old check date: db_query "SELECT ID FROM File Where (TTCheck < '$DATE' OR TTCheck IS NULL) AND (TTSync=$TTSYNC_EXIST OR TTSync=$TTSYNC_BACKUP);" | while read line; do #for each ID with an old check date ... ID=$line [ $DEBUG == $TRUE ] && echo "Progress ID: $ID" >&2 FILE=$(db_query "SELECT CONCAT('$moviedir/', Folder, '/', Name) FROM File WHERE ID=$ID;") if [ -f "$FILE" ]; then SIZE=$(db_query "SELECT Size FROM File WHERE ID=$ID;") SIZE_new="$(file_size "$FILE")" if [ "$SIZE" != "$SIZE_new" ]; then echo "FILE CHANGE: $FILE" if [ "0" == "$SIZE_new" ]; then #file exist but to smal echo "FILE EMPTY: $FILE" db_query "UPDATE File SET TTSync=$TTSYNC_DEL,TTCheck='$DATE' WHERE ID=$ID;" else #recalc md5 ... + check #update DB MD5_new=$(md5sum "$FILE" | cut -c -32) MD5=$(db_query "SELECT MD5 FROM File WHERE ID=$ID;") if [ "$MD5" == "$MD5_new" ]; then db_query "UPDATE File SET Size=$SIZE_new,TTCheck='$DATE' WHERE ID=$ID;" else #new file/file changed! db_query "UPDATE File SET TTSync=$TTSYNC_DEL,TTCheck='$DATE' WHERE ID=$ID;" file_add "$(db_query "SELECT CONCAT(Folder, '/', Name) FROM File WHERE ID=$ID;")" "$MD5_new" fi fi else #add timestamp that nothing has changed db_query "UPDATE File SET TTCheck='$DATE' WHERE ID=$ID;" fi else # file dont exist echo "FILE DEL/MV: $FILE" db_query "UPDATE File SET TTSync=$TTSYNC_DEL,TTCheck='$DATE' WHERE ID=$ID;" fi done #add new files .... cat "$list_tmp/new" | while read line; do file_add "$line" done rm -r "$list_tmp/" } ########################### ## sub functions ######### ########################### # file_add [rel.path] (md5) function file_add() { local MD5="$2" local relrevpath="$(echo "$1" | sed "s|^$moviedir||g" | sed 's|^/||g' | sed 's|/$||g' | rev )" local name="$(echo "$relrevpath" | cut -d '/' -f 1 | rev | sed "s/'/''/g")" #cahr ' set to '' because of SQL Querys local folder="$(echo "$relrevpath" | cut -d '/' -f 2- | rev | sed "s/'/''/g")" #cahr ' set to '' because of SQL Querys local FILE="$moviedir/$(echo "$relrevpath" | rev)" [ -f "$FILE" ] || { echo "ERROR: file_add: file not exist: $FILE" >&2 return 1 } [ $DEBUG == $TRUE ] && echo "add: $name" >&2 [ -z "$MD5" ] && MD5="$(md5sum "$FILE" | cut -c -32)" local SIZE="$(file_size "$FILE")" [ "$SIZE" -le 0 ] && { [ $DEBUG == $TRUE ] && echo File to smal >&2 return 0 } #wenn einmal existiert ... { # undelet files ... local IDs_undel="$(db_query "SELECT ID FROM File WHERE TTSync='$TTSYNC_DEL' AND MD5='$MD5' AND Name='$name' AND Folder='$folder';")" [ $DEBUG == $TRUE ] && echo "IDs_undel: $IDs_undel" >&2 [ -n "$IDs_undel" ] && echo "FILE UNDEL: $FILE" db_query "UPDATE File SET TTSync=$TTSYNC_EXIST,TTCheck='$DATE',Size='$SIZE' WHERE TTSync='$TTSYNC_DEL' AND MD5='$MD5' AND Name='$name' AND Folder='$folder';" #same path wrong md5 [ $DEBUG == $TRUE ] && echo "IDs_W5: $(db_query "SELECT ID FROM File WHERE TTSync!='$TTSYNC_REMOTE' AND TTSync!='$TTSYNC_DEL' AND MD5!='$MD5' AND Name='$name' AND Folder='$folder';")" >&2 db_query "UPDATE File SET TTSync=$TTSYNC_DEL,TTCheck='$DATE' WHERE TTSync!='$TTSYNC_REMOTE' AND TTSync!='$TTSYNC_DEL' AND MD5!='$MD5' AND Name='$name' AND Folder='$folder';" #if something MVs ... local IDs_mv="$(db_query "SELECT ID FROM File WHERE MD5='$MD5' AND Size='$SIZE' AND (Name!='$name' OR Folder!='$folder');")" [ $DEBUG == $TRUE ] && echo "IDs_mv: $IDs_mv" >&2 [ -n "$IDs_mv" ] && echo "FILE MV: $(db_query "SELECT CONCAT(Folder,Name) FROM File WHERE ID=$(echo $IDs_mv | cut -d ' ' -f1);") -> $FILE" db_query "UPDATE File SET TTCheck='$DATE',Name='$name',Folder='$folder',TTSync='$TTSYNC_EXIST' WHERE MD5='$MD5' AND Size='$SIZE' AND (Name!='$name' OR Folder!='$folder');" #es existiert genau so ein eintrag local IDs_orig="$(db_query "SELECT ID FROM File WHERE MD5='$MD5' AND Name='$name' AND Folder='$folder';")" [ $DEBUG == $TRUE ] && echo "IDs_orig: $IDs_orig" >&2 } #wenn weder gelöschte wiederhergestellt noch verschobene dateien entdekt... -> neuer eintrag [ "$((${#IDs_mv}+${#IDs_undel}+${#IDs_orig}))" == 0 ] && { echo "FILE ADD: $FILE" db_query "INSERT INTO File (Name,Folder,MD5,Size,TTSync,TTCheck) VALUES ('$name','$folder','$MD5','$SIZE',$TTSYNC_EXIST,'$DATE');" } } #all loaded stat now main