2 Май 2016

Скрипт синхронизации локальной папки с MEGA


В связи с поступающими запросами от публики по вопросам использования упомянутого в прошлом посте пакета Megatools, который предназначе для работы с облачным хранилищем MEGA из командной строки, предлагаю пример простого shell-скрипта для синхронизации данных из локальной папки.

Итак, имеем систему на FreeBSD.

root@beta:~ # uname -v
FreeBSD 10.3-RELEASE #0 r297264: Fri Mar 25 02:10:02 UTC 2016     root@releng1.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC

1. Устанавливаем Megatools

Для начала установим сам пакет Megatools.

root@beta:~ # pkg install megatools
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        megatools: 1.9.96

The process will require 1 MiB more space.
188 KiB to be downloaded.

Proceed with this action? [y/N]: y
Fetching megatools-1.9.96.txz: 100%  188 KiB 192.0kB/s    00:01
Checking integrity... done (0 conflicting)
[1/1] Installing megatools-1.9.96...
[1/1] Extracting megatools-1.9.96: 100%

2. Создаём shell-скрипт для синхронизации

Создадим сам скрипт в рабочей папке пользователя от имени которого он и будет запускаться.

root@beta:~ # cd ~
root@beta:~ # ls -l megasync.sh
-rwxr-xr-x  1 root  wheel  1176  1 май 15:31 megasync.sh
root@beta:~ # cat megasync.sh
#!/bin/sh

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

locdir="/usr/local/www/kostikov.co/bl-content"  # local dir
remdir="/Root/kostikov.co/bl-content"           # remote dir
datetime=`date '+%Y-%m-%d %H:%M:%S'`
log="/var/log/megasync.log"                     # log location
login="your@login.name"                         # MEGA login name
pass="y0UrpaSs"                                 # MEGA password

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

# --- create directory on cloud drive if not exist
if [ `megals $id $remdir 2>/dev/null | wc -l` == 0 ];
then
        megamkdir $id $remdir 2>/dev/null
fi

# --- delete localy absent files and directories from cloud drive
DEL=`megacopy --dryrun --reload --download $id --local $locdir --remote $remdir 2>/dev/null | sed 's|. '$locdir'|'$remdir'|g'`
for i in $DEL;
do
        megarm $id $i 2>/dev/null
done

# --- delete localy modified files from cloud drive...
if [ -f $log ];
then
        # ...using log modification as criterion
        for i in `find $locdir -type f -newer $log | sed 's|'$locdir'|'$remdir'|g'`;
        do
                megarm $id $i 2>/dev/null
        done
fi

# --- sync local data
SYNC=`megacopy --no-progress $id --local $locdir --remote $remdir 2>/dev/null | sed 's|. '$remdir'|'$locdir'|g'`

# --- write results in log
echo "$datetime synchronization to MEGA done!" >> $log
echo "Files removed:" $DEL >> $log
echo "Files synchronized:" $SYNC >> $log
echo "-----" >> $log

В качестве пояснение логики его работы. Из локальной папки locdir данные будут синхронизировать в облачную remdir. Процесс происходит в три этапа.

  1. Сначала с облачного диска MEGA удаляюстя все файлы и папки, которые отсутствуют локально (если они там, разумеется, есть).
  2. Далее из облачной папки удаляются также и те файлы, которые за прошедшие с момента последней синхронизации были изменены. При это в качестве маркера времени синхронизации используется дата-время модификации лог-файла log.
  3. И, наконец, содержимое облачного диска синхронизируется до нынешнего состояния локальной папки.

Результаты со списком удалённых, модифицированных и закачанных на MEGA файлов записываются в лог-файл.

root@beta:~ # tail /var/log/megasync.log
2016-05-01 16:06:44 synchronization to MEGA done!
Files removed:
Files synchronized: /usr/local/www/kostikov.co/bl-content/posts/skript-sinhronizacii-lokalnoj-papki-s-mega/index.txt /usr/local/www/kostikov.co/bl-content/databases/plugins/sitemap/sitemap.xml /usr/local/www/kostikov.co/bl-content/databases/plugins/rss/rss.xml /usr/local/www/kostikov.co/bl-content/databases/pages.php /usr/local/www/kostikov.co/bl-content/databases/posts.php /usr/local/www/kostikov.co/bl-content/databases/tags.php
-----

3. Добавляем его в cron

root@beta:~ # cat /etc/crontab | grep megasync
0       1       *       *       *       root    /root/megasync.sh >/dev/null 2>&1

В данном случае синхронизация будет выполняться один раз в сутки в 1:00.

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

4. PROFIT!

Статья была полезной? Тогда прошу не стесняться и поддерживать деньгами через PayPal или Яндекс.Деньги.


dev  FreeBSD  Mega  shell