#!/bin/bash copyFiles_action() { (( cron )) || echo -n $'Copying files...\033[K' echo ' SELECT source_files.filename, source_files.last_change, destinations.id, destinations.name, destination_files.id FROM source_files INNER JOIN destination_files ON source_files.id = destination_files.source_file_id INNER JOIN destinations ON destination_files.destination_id=destinations.id INNER JOIN mime_type_actions ON mime_type_actions.id = source_files.mime_type WHERE CAST(destination_files.last_change AS TEXT) <> CAST(source_files.last_change AS TEXT) AND mime_type_actions.destination_id = destinations.id AND mime_type_actions.action = 2; SELECT "AtOM:NoMoreFiles";' >&3 read -u4 line while ! [[ $line = AtOM:NoMoreFiles ]] do copyfiles+=("$line") read -u4 line done echo 'BEGIN TRANSACTION;' >&3 for copyfile in "${copyfiles[@]}" do sourcefilename=${copyfile%%::AtOM:SQL:Sep::*} sourcedir=${sourcefilename%/*} rest="${copyfile#*::AtOM:SQL:Sep::}::AtOM:SQL:Sep::" lastchange=${rest%%::AtOM:SQL:Sep::*} rest=${rest#*::AtOM:SQL:Sep::} destinationid=${rest%%::AtOM:SQL:Sep::*} rest=${rest#*::AtOM:SQL:Sep::} destination=${rest%%::AtOM:SQL:Sep::*} rest=${rest#*::AtOM:SQL:Sep::} destfileid=${rest%%::AtOM:SQL:Sep::*} rest=${rest#*::AtOM:SQL:Sep::} (( count++ )) (( cron )) || printf '\b\b\b\b%3i%%' $(( (count * 100) / ${#copyfiles[@]} )) if [ -n "${destinationrenamepath["$destination"]}" ] then destdir="$(guessPath)" guessstatus=$? case $guessstatus in 1) continue ;; 2) (( postponed++ )) continue ;; esac else destdir="${destinationpath["$destination"]}/" if [[ $sourcefilename =~ / ]] then destdir+=$( sanitizeFile "${sourcefilename%%/*}" dir ) part=${sourcefilename#*/} while [[ $part =~ / ]] do destdir+="/$( sanitizeFile "${part%%/*}" dir )" part=${part#*/} done if ! [ -d "$destdir" ] then mkdir -p "$destdir" fi fi fi if cp -a --reflink=always \ "$sourcepath/$sourcefilename" \ "$destdir" \ 2>/dev/null \ || cp -al \ "$sourcepath/$sourcefilename" \ "$destdir" \ 2>/dev/null \ || cp -a \ "$sourcepath/$sourcefilename" \ "$destdir" then Update destination_files \ filename \ "$destdir/${sourcefilename##*/}"\ rename_pattern \ "${destinationrenamepath[$destination]}/${destinationrename[$destination]}"\ fat32compat \ ${destinationfat32compat["$destination"]}\ ascii \ ${destinationascii["$destination"]}\ last_change \ $lastchange \ <<-EOWhere id = $destfileid EOWhere (( done++ )) fi done echo 'COMMIT;' >&3 if (( count )) then (( cron )) || echo -n $'\r' if (( count )) then echo -n "Copied ${done:-0} of $count" \ "files${postponed+ ($postponed postponed)}." (( cron )) || echo -en "\033[K" echo else (( cron )) || echo -n $'\r\033[K' fi unset count done }