И вновь по просьбам помочь с усовершенствованием скрипта синхронизации с облачным харанилищем Mega, описанным в соответствующей статье, публикую его доработанную с учётом пожеланий версию.
Основным ограничением упомянутого выше скрипта является его направленность на работу исключительно с одним конкретным каталогом (и, конечно же, вложенным в него, подкаталогами и файлами). При этом в качестве маркера времени для отслеживания изменений выступает дата модификации ведущегося файла протокола.
Очевидно, что в случае, если требуется независимая синхронизация набора каталогов объём которых и, соответственно, и время потребное на их загрузку во внешнее хранилище, может быть существенным, такой подход применять нельзя, поскольку всегда есть риск, что содержимое одного из синхронизируемых каталогов может измениться в этот промежуток и, следовательно, оно не будет впоследствии идентифицированно как обновлённое.
Здесь разумно применять подход, который позволит вести, как бы, раздельный учёт времени последней синхронизации и, соответственно, принимать решение о необходимости обновления изменённого содержимого каталога на 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.
Ну и традиционно, прошу не стесняться и поддерживать деньгами через PayPal или Яндекс.Деньги.