18 Апрель 2017

Скрипт синхронизации набора каталогов в облако Mega

Shell-script to syncronize directory list to Mega cloud drive

И вновь по просьбам помочь с усовершенствованием скрипта синхронизации с облачным харанилищем Mega, описанным в соответствующей статье, публикую его доработанную с учётом пожеланий версию.

Основным ограничением упомянутого выше скрипта является его направленность на работу исключительно с одним конкретным каталогом (и, конечно же, вложенным в него, подкаталогами и файлами). При этом в качестве маркера времени для отслеживания изменений выступает дата модификации ведущегося файла протокола.

Очевидно, что в случае, если требуется независимая синхронизация набора каталогов объём которых и, соответственно, и время потребное на их загрузку во внешнее хранилище, может быть существенным, такой подход применять нельзя, поскольку всегда есть риск, что содержимое одного из синхронизируемых каталогов может измениться в этот промежуток и, следовательно, оно не будет впоследствии идентифицированно как обновлённое.

1. Скрипт

Здесь разумно применять подход, который позволит вести, как бы, раздельный учёт времени последней синхронизации и, соответственно, принимать решение о необходимости обновления изменённого содержимого каталога на Mega. Для этих целей автор применил запись специальных файлов .megasync в нулевой длиной, время создания (модификации) которых и выступает искомым маркером.

root@beta:~ # cat /root/megasync.sh
#!/bin/sh

# Syncronize list of local directories on MEGA cloud drive
# v.20160907 (c)2016 by Max Kostikov http://kostikov.co e-mail: max@kostikov.co

locdir="/usr/local/www"                         # local root dir
remdir="/Root/backup"                           # remote dir
log="/var/log/megasync.log"                     # log location
login="your@login.name"                         # MEGA login name
pass="y0UrpaSs"                                 # MEGA password

# --- local subdirs list
SITES="kostikov.co my.server"

id="--username $login --password $pass"

echo "`date '+%Y-%m-%d %H:%M:%S'` --- Starting syncronization to MEGA..." >> $log
for j in $SITES;
do
        echo "`date '+%Y-%m-%d %H:%M:%S'` ---    Doing for ($locdir/$j)." >> $log
        # --- create directory on cloud drive if not exist
        if [ `megals $id $remdir/$j 2>/dev/null | wc -l` == 0 ];
        then
                megamkdir $id $remdir/$j
                echo "`date '+%Y-%m-%d %H:%M:%S'`        Remote directory created ($remdir/$j)." >> $log
        fi

        # --- delete localy absent files and directories from cloud drive
        DEL=`megacopy --dryrun --reload --download $id --local $locdir/$j --remote $remdir/$j 2>/dev/null | sed 's|. '$locdir'|'$remdir'|g'`
        for i in $DEL;
        do
                megarm $id $i
        done
        echo "`date '+%Y-%m-%d %H:%M:%S'`        Files removed: " $DEL >> $log

        # --- delete localy modified files from cloud drive...
        # ...using .megasync modification as criterion
        if [ -f $locdir/$j/.megasync ];
        then
                UPD=`find $locdir/$j -type f -newer $locdir/$j/.megasync | sed 's|'$locdir'|'$remdir'|g'`
                echo "`date '+%Y-%m-%d %H:%M:%S'`        Files to update: " $UPD >> $log
                for i in $UPD;
                do
                        megarm $id $i
                done
                megarm $id $remdir/$j/.megasync
        fi
        cat /dev/null > $locdir/$j/.megasync

        # --- sync local data
        SYNC=`megacopy --no-progress $id --local $locdir/$j --remote $remdir/$j 2>/dev/null | sed 's|. '$remdir'|'$locdir'|g'`
        echo "`date '+%Y-%m-%d %H:%M:%S'`        Files synchronized: " $SYNC >> $log

        echo "`date '+%Y-%m-%d %H:%M:%S'` ---    Process done!" >> $log
done

echo "`date '+%Y-%m-%d %H:%M:%S'` --- Synchronization to MEGA done!" >> $log

В данном скрипте в качестве примера синхронизируются каталоги kostikov.co и my.server перечисленные через пробел в списке с именем SITES расположенные в являющимся для них корневом каталоге с путём /usr/local/www.

Собственно, далее используется идентичный предыдущему алгоритм синхронизации, применяемый поочерёдно для каждого каталога из списка с ведением общего лога действий.

Не забудьте, что вам необходим установленный набор утилит Megatools для работы с облаком MEGA.

2. PROFIT !

Ну и традиционно, прошу не стесняться и поддерживать деньгами через PayPal или Яндекс.Деньги.


dev  Mega  shell