Sync với cloud drive (I)

Cách đơn giản nhất là định kỳ sync một thư mục local với một thư mục remote, thí dụ Google Drive, hay ngược lại. Việc này rclone làm tốt, script chỉ định kỳ làm việc qua crontab mà không cần giám sát sự thay đổi trong thư mục, áp dụng cho rất nhiều loại ổ đĩa đám mây.

#!/bin/bash
# Script cloudsync, sync cloud drive, version 20191108
# © 2019 LNT <lnt@ly-le.info>
#
function usage(){
  cat >&2 <<EOF

usage: $(basename $0) [-a age] [-c] [-L hoặc -z] [-P] FROM_DIR TO_DIR1^TO_DIR2...
  -a age: chỉ sync file/thư mục tạo/thay đổi không quá thời gian age này
          age có hậu tố là ms|s|m|h|d|w|M|y
  -c    : copy thay vì sync
  -L    : sao chép thư mục đích của symbolic link
  -z    : sao chép các symlink thành file nén TO_DIR/symlink.tgz
          không có option L và z thì symlink bị bỏ qua
  -P    : in tiến trình sao chép
  FROM_DIR, TO_DIR: local|remote folder

EOF
  echo -e "[!] Lỗi: $1!\n"
  exit 2
}

FROM_DIR=TO_DIR=''
z_flag=c_flag=0
OPT="-u --fast-list --transfers=20 --checkers=20 --tpslimit=20 --drive-chunk-size=1M"
LOG="--log-file=/tmp/$(basename $0).log"
while getopts :a:czLP opt; do
  case $opt in
    a)  [[ "$OPTARG" =~ [0-9]+(ms|[smhdwMy]) ]] && OPT="--max-age=$OPTARG $OPT" || usage "Option -a có thời gian không đúng"
        ;;
    c)  c_flag=1
        ;;
    L|P)
        OPT="-$opt $OPT"
        ;;
    z)  z_flag=1
        ;;
    :)  usage "-${OPTARG} cần có tham đối"
        ;;
    ?)  usage "Option '-${OPTARG}' không hợp lệ"
        ;;
  esac
done
shift $(( $OPTIND-1 ))
[ $# -ne 2 ] && usage "FROM_DIR hay TO_DIR không hợp lệ"
if [[ $1 == *":"* && $2 != *":"* ]] || [[ $1 != *":"* && $2 == *":"* ]]; then
  FROM_DIR="$1"
  TO_DIR="$2"
else
  usage "FROM_DIR hay TO_DIR không hợp lệ"
fi
if (( $z_flag )); then
  [ "$(sed '/-L\b/!d' <<< $OPT)" ] && usage "Không dùng cùng lúc option -L và -z" || OPT="--skip-links $OPT"
  OPT=$(sed 's/--max-age=[0-9]*\(ms\|[smhdwMy]\)//' <<< $OPT)
  tmp=$(mktemp)
  slnk=$(find "$FROM_DIR" -type l -exec test -e {} \; -print)
  [ -z "$slnk" ] && z_flag=0 || tar -czf $tmp $slnk &> /dev/null
fi

oldIFS=$IFS; IFS='^'; TO_DIRS=($TO_DIR); IFS=$oldIFS
if ! ps ax | grep -v grep | grep "rclone sync" &> /dev/null; then
  (( $c_flag )) && cmd=copy || cmd=sync
  for dir in ${TO_DIRS[@]}; do
    rclone $cmd "$FROM_DIR" "$dir" $OPT $LOG
    (( $z_flag )) && rclone copyto "$tmp" $dir/symlink.tgz $OPT $LOG
  done
fi

Gỉa sử thư mục cục bộ là /path/to/local và thư mục remote là remote:folder

Cài đặt mỗi 15 phút sync với ổ đĩa đám mây, thí dụ Google Drive, trong crontab như sau

*/15 * * * * /path/to/cloudsync /path/to/local remote:folder

Để lấy file từ ổ đĩa đám mây, viết lại câu lệnh

/path/to/cloudsync remote:folder /path/to/local

Chú thích

  • Áp dụng cho mọi ổ đĩa đám mây mà rclone hỗ trợ
  • Với dữ liệu khá lớn, thí dụ 100GB, thời gian kiểm tra/đồng bộ mất hơn 30 phút. Vì vậy phải chỉnh crontab cho hợp lý.
  • Giả sử định kỳ backup ngày 1 lần, chúng ta có thể đặt option -a 24h dặn rclone chỉ backup những file/thư mục được tạo/thay đổi trong 24 giờ trở lại thôi, giúp giảm đáng kể thời gian làm việc.
  • Trường hợp TO_DIR là ổ đĩa đám mây, có thể sao lưu lên nhiều ổ đĩa đám mây,
cloudsync -a 24h /path/to/local remote:folder
cloudsync -a 24h /path/to/local remote1:folder1^remote2:folder2

Comments Off on Sync với cloud drive (I)

Filed under Software

Comments are closed.