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