Skip to content

Instantly share code, notes, and snippets.

@why404
Last active December 11, 2015 05:48
Show Gist options
  • Save why404/4554492 to your computer and use it in GitHub Desktop.
Save why404/4554492 to your computer and use it in GitHub Desktop.
qboxrsctl + inotify-tools 实现七牛云存储文件管理。 可监控指定目录,若发现新增/改动的文件可自动上传,若发现有文件删除可自动删除七牛云存储上对应的文件(不需要该功能可注释相关代码)。 工具下载 - qboxrsctl - <http://docs.qiniutek.com/v3/tools/qboxrsctl/> - inotify-tools - <https://github.com/rvoicilas/inotify-tools/wiki>
#!/bin/sh
# 此脚本可监控 Linux/Unix 上指定的文件夹,并将此文件夹内的新增或改动文件自动同步到七牛云存储,可设定同步删除。
# 1. 需先安装 inotify-tools - <https://github.com/rvoicilas/inotify-tools/wiki>
# 2. 然后下载 qboxrsctl - <http://docs.qiniutek.com/v3/tools/qboxrsctl/>
# 获取 ACCESS_KEY 和 SECRET_KEY 以及 BUCKET_NAME (空间名称) 请登录:<https://dev.qiniutek.com>
# 用法(反斜杠用于排版换行需要,实际情况下可忽略):
#
# ./qiniu-autosync.sh -a /PATH/TO/appkey.json \ # appkey.json 写明 {"access_key":"YOUR_ACCESS_KEY", "secret_key": "YOUR_SECRET_KEY"}
# -b BUCKET_NAME \ # 用于存储文件的七牛空间名称
# -c /PATH/TO/qboxrsctl \ # qboxrsctl 可执行命令所在路径
# -d /PATH/TO/WATCH_DIR \ # 要监控的目录,绝对路径
# -e ALLOW_DELETE_TrueOrFalse \ # 是否允许自动删除,缺省为 false
# -f FILE_BLOCK_SIZE \ # 超过这个大小启用并行断点续上传,缺省为 4 MB
# -g INOTIFY_IGNORE_PATTERN # 忽略列表(正则),缺省为 "^(.+(\~|\.sw.?)|4913)$" (即 vim 临时文件)
#
# 超过这个大小启用并行断点续上传,缺省 4 MB
QINIU_BLOCK_SIZE=4194304
# 是否允许自动删除,缺省不允许
ALLOW_DELETE=false
# 忽略 vim 创建的临时文件,这里可以自定义忽略正则
INOTIFY_IGNORE_PATTERN="^(.+(\~|\.sw.?)|4913)$"
# inotifywait 可执行命令所在路径
INOTIFY_BIN=/usr/bin/inotifywait
INOTIFY_EVENTS="moved_to,create,delete,close_write,close"
INOTIFY_TIME_FMT="%d/%m/%y %H:%M"
INOTIFY_FORMAT="%T %w%f %e"
while getopts a:b:c:d:e:f:g: option
do
case "${option}"
in
a) QINIU_APPKEY_FILE=${OPTARG};;
b) QINIU_BUCKET=${OPTARG};;
c) QINIU_CMD=${OPTARG};;
d) WATCH_DIR=${OPTARG};;
e) ALLOW_DELETE=${OPTARG};;
f) QINIU_BLOCK_SIZE=${OPTARG};;
g) INOTIFY_IGNORE_PATTERN=${OPTARG};;
esac
done
getFileKey() {
dir=$1
file=$2
key=${file##*$dir}
if [ `echo $key | cut -c1-1` = "/" ]; then
key=`echo $key | cut -c2-${#key}`
fi
echo $key
}
$INOTIFY_BIN --exclude "$INOTIFY_IGNORE_PATTERN" -mre "$INOTIFY_EVENTS" --timefmt "$INOTIFY_TIME_FMT" --format "$INOTIFY_FORMAT" $WATCH_DIR | while read date time file event
do
case "$event" in
CLOSE_WRITE,CLOSE | MOVED_TO)
key=`getFileKey $WATCH_DIR $file`
echo "start uploading ${file}"
if [ `stat -c %s $file` -gt $QINIU_BLOCK_SIZE ]; then
$QINIU_CMD -a $QINIU_APPKEY_FILE put -c $QINIU_BUCKET $key $file
else
$QINIU_CMD -a $QINIU_APPKEY_FILE put $QINIU_BUCKET $key $file
fi
echo "successfully uploaded $QINIU_BUCKET:$key"
;;
DELETE)
echo "deleting file: ${file}"
if $ALLOW_DELETE; then
key=`getFileKey $WATCH_DIR $file`
echo "deleting key: ${key}"
$QINIU_CMD -a $QINIU_APPKEY_FILE del $QINIU_BUCKET $key
echo "successfully deleted $QINIU_BUCKET:$key"
else
echo "${date} ${time} ${file} ${event}"
echo "\"$QINIU_BUCKET:$key\" will not be deleted."
fi
;;
*)
echo "${date} ${time} ${file} ${event}"
;;
esac
done
@why404
Copy link
Author

why404 commented Jan 17, 2013

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment