qupload

Chu-Siang Lai edited this page Nov 8, 2016 · 51 revisions

简介

qupload是用来将本地目录中的所有文件同步到七牛空间中的命令。 有如下一些特点:

  1. 同步之前,本地路径中文件快照功能
  2. 同步过程中,记录下同步成功的文件位置,在被中止后,下次重新同步时,可以从中止处开始
  3. 同步过程的进度显示,可以看到当前同步的文件是所有文件中的第几个,以及同步进度百分比

格式

qshell qupload [<ThreadCount>] <LocalUploadConfig>

参数

参数名 描述 可选参数
ThreadCount 并发上传的协程数量 Y
LocalUploadConfig 数据同步的配置文件,该配置文件里面包含了一些诸如目标空间名称,AccessKey,SecretKey等信息,详情参考配置文件的讲解 N

配置

qupload功能需要配置文件的支持,配置文件的内容如下:

{
   "src_dir"            :   "<LocalPath>",
   "access_key"         :   "<Your AccessKey>",
   "secret_key"         :   "<Your SecretKey>",
   "bucket"             :   "<Bucket>",
   "file_list"          :   "<FileList>",
   "zone"               :   "<Zone>",
   "ignore_dir"         :   false,
   "key_prefix"         :   "<Key Prefix>",
   "up_host"            :   "<Upload Host>",
   "overwrite"          :   false,
   "check_exists"       :   false,
   "check_hash"         :   false,
   "check_size"         :   false,
   "skip_file_prefixes" :   ".git,bin",
   "skip_path_prefixes" :   "hello/,temp/",
   "skip_fixed_strings" :   ".svn",
   "skip_suffixes"      :   ".DS_Store,.exe",
   "rescan_local"       :   true,
   "log_file"           :   "upload.log",
   "log_level"          :   "info"
}
参数名 描述 可选参数
src_dir 本地同步路径,为全路径格式,程序将同步该目录下面所有的文件;在Windows系统下面使用的时候,注意dest_dir的设置遵循D:\\jemy\\backup这种方式。也就是路径里面的\要有两个(\\ N
access_key 七牛账号对应的AccessKey N
secret_key 七牛账号对应的SecretKey N
bucket 同步数据的目标空间名称,可以为公开空间或私有空间 N
file_list 待同步文件列表,该文件列表内容必须是相对于src_dir的文件相对路径列表,可以不指定,程序将自动获取src_dir下面的文件列表。请使用dircache命令生成这个文件列表,生成之后可以手动删除不需要的行 Y
zone 空间所属的区域位置,可选值为nbbchnna0,默认为nb Y
up_host 上传域名,可选设置,默认为 http://up.qiniu.com Y
ignore_dir 保存文件在七牛空间时,使用的文件名是否忽略本地路径,默认为false Y
key_prefix 在保存文件在七牛空间时,使用的文件名的前缀,默认为空字符串 Y
overwrite 是否覆盖空间中已有的同名文件,默认不覆盖。 Y
check_exists 每个文件上传之前是否检查空间中是否存在同名文件,默认为false,不检查 Y
check_hash check_exists设置为true的情况下生效,是否检查本地文件hash和空间文件hash一致,默认不检查,节约同步时间 Y
check_size check_exists设置为true的情况下,如果check_hashfalse,那么你可以设置check_sizetrue做简单的大小检查,以查看本地文件和空间文件大小是否一致,默认不检查 Y
skip_file_prefixes 跳过所有文件名(不带相对路径)以该前缀列表里面字符串为前缀的文件 Y
skip_path_prefixes 跳过所有文件路径(相对路径)以该前缀列表里面字符串为前缀的文件 Y
skip_fixed_strings 跳过所有文件路径(相对路径)中包含该字符串列表中字符串的文件 Y
skip_suffixes 跳过所有以该后缀列表里面字符串为后缀的文件或者目录 Y
rescan_local 默认情况下,本地新增的文件不会被同步,需要手动设置为true才会去检测新增文件。 Y
log_level 上传日志输出级别,可选值为debug,info,warn,error,默认info Y
log_file 上传日志的输出文件,可选值为stdout,stderr,本地日志文件名,默认stdout Y

备注:可选参数可以根据个人需要设置,不使用时不必写在配置文件中

关于up_hostzone的值:

默认情况下,up_hostzone 所指定机房的源站域名,如果zone不指定,则默认为华东机房

up_host默认值和zone的关系:

up_host zone 机房
http://up.qiniu.com 不设置 华东机房
http://up.qiniu.com nb 华东机房
http://up-z1.qiniu.com bc 华北机房
http://up-z2.qiniu.com hn 华南机房
http://up-na0.qiniu.com na0 北美机房

如果你需要使用加速上传,则配置文件里面使用如下的up_hostzone

up_host zone 机房
http://upload.qiniu.com 不设置 华东机房
http://upload.qiniu.com nb 华东机房
http://upload-z1.qiniu.com bc 华北机房
http://upload-z2.qiniu.com hn 华南机房
http://upload-na0.qiniu.com na0 北美机房

关于check_existsoverwritecheck_hashcheck_size的关系

默认情况下,同步程序不会检查本地文件是否已经在空间中有一个同名文件,这样如果空间中已经存储同名文件,那么上传默认就会失败,在这个时候,如果overwrite设置为true的话,会覆盖远程文件,否则会报错{"error":"file exists"}

如果设置了check_existstrue,那么同步程序在上传每个文件之前,会检查空间中是否存在同名文件,如果发现同名文件的话,它会根据check_hashcheck_size的值来做进一步的匹配检查,如果最后确认文件内容或者大小一致,那么就不再重复同步这个文件,否则会根据overwrite的状态决定是否去强制覆盖。

其中check_hash设置为true的时候会在check_exists发现文件已在空间存在的情况下,计算本地文件的hash来和空间中的文件hash进行匹配,如果一致则不重复同步,否则在overwritetrue的情况下会去强制覆盖。

因为计算本地文件的hash在文件较大的情况下可能会比较耗时,如果你确信空间中如果存在同名文件的话,那么它的内容肯定是和本地一致的,那么做简单的文件大小检查可以节约很多时间,这个check_sizetrue将在check_existstrue,同时check_hashfalse的时候生效,仅检查本地文件大小是否和远程的一致,如果不一致,那么在overwritetrue的情况下会去强制覆盖。

关于skip_file_prefixesskip_path_prefixesskip_fixed_stringsskip_suffixes

skip_file_prefixes 根据文件名(不带相对路径)的前缀来跳过,不上传匹配的文件 skip_path_prefixes 根据文件路径(相对路径)的前缀来跳过,不上传匹配的文件 skip_fixed_strings 根据文件路径(相对路径)中包含的字符串来跳过,不上传路径中含有指定字符串列表中字符串的文件 skip_suffixes 根据文件的后缀或者目录的后缀来跳过,不上传文件或者匹配目录下的文件

skip_file_prefixesskip_path_prefixesskip_fixed_stringsskip_suffixes 里面都可以指定多个要忽略的文件或目录前缀或者后缀或者子字符串,彼此用逗号分开,另外字符串两边的空白字符会被忽略。

比如对于目录 /Users/jemy/Temp/upload 下的文件,src_dir设置为 /Users/jemy/Temp/upload

那么

 jemy@jemy-MacBook ~/Temp/upload $ tree
 .
 ├── cloud-market-1.jpg
 ├── cloud-market-2.jpg
 ├── hello.txt
 └── test
     └── cloud-market-3.jpg

我们可以设置skip_suffixes.txt 来忽略txt文件,或者skip_path_prefixestest来跳过test文件夹不上传。

注意:skip_file_prefixesskip_path_prefixesskip_fixed_stringsskip_suffixes 均不支持通配符。

关于ignore_dirkey_prefix

所谓的ignore_dir的意思,举个例子,我们要同步目录/Users/jemy/Temp目录下的文件,该目录下的文件结构如下:

.
├── f1
│   └── world.txt
└── hello.txt

如果我们忽略文件路径(ignore_dir=true),那么保存在七牛空间中的文件名将是world.txthello.txt。如果不忽略文件路径(ignore_dir=false),那么保存在七牛空间中的文件名将是f1/world.txthello.txt

如果指定key_prefix这个参数,那么程序将在本地的文件名前面加上这个字符串。这个key_prefixignore_dir的基础上生效,比如我们忽略文件路径(ignore_dir=true)的情况下,key_prefix指定为2015/01/18/,那么最终保存在七牛的文件名将是2015/01/18/hello.txt2015/01/18/world.txt,如果我们不忽略文件路径(ignore_dir=false)的情况下,key_prefix指定为2015/01/18/,那么最终保存在七牛的文件名将是2015/01/18/f1/world.txt2015/01/18/hello.txt

场景化文件同步

下面是这个路径(/Users/jemy/Temp7)的文件树状结构:

├── frog.png
├── funny.png
├── golang.png
└── sub1
    ├── golang.png
    └── sub2
        └── funny.png

想要同步本地文件到七牛,最简单的方式

注意: 如果系统是WINDOWS的话,"src_dir" 的参数应该是 "D:\\jemy\\Temp7"

{
    "src_dir"       :   "/Users/jemy/Temp7",
    "access_key"    :   "ELUs327kxVPJrGCXqWaexyioc0xYZyrIpbM6Wh6x",
    "secret_key"    :   "LVzZY2SqOQ_I_kM1n02ygACVBArDvOWtiLkDtKip",
    "bucket"        :   "if-pbl"
}

上面的配置文件将同步本地目录/Users/jemy/Temp7下面的文件到空间if-pbl中,所有的保存在空间中的文件将以相对于路径/Users/jemy/Temp7的文件路径来命名。所以,保存在空间中的文件名是:

frog.png
funny.png
golang.png
sub1/golang.png
sub1/sub2/funny.png

想要给同步到七牛的空间加上统一前缀

{
    "src_dir"       :   "/Users/jemy/Temp7",
    "access_key"    :   "ELUs327kxVPJrGCXqWaexyioc0xYZyrIpbM6Wh6x",
    "secret_key"    :   "LVzZY2SqOQ_I_kM1n02ygACVBArDvOWtiLkDtKip",
    "bucket"        :   "if-pbl",
    "key_prefix"    :   "2016/03/07/"
}

那么,保存在空间中的文件名是:

2016/03/07/frog.png
2016/03/07/funny.png
2016/03/07/golang.png
2016/03/07/sub1/golang.png
2016/03/07/sub1/sub2/funny.png

想要忽略本地文件的相对路径,比如本地存在一些层级,但是层级里面的文件和外面的文件名称和内容都相同的情况下,为了避免重复上传不需要的文件,可以使用忽略本地文件的相对路径的方法。这种情况下,也可以附带额外的前缀。

{
    "src_dir"       :   "/Users/jemy/Temp7",
    "access_key"    :   "ELUs327kxVPJrGCXqWaexyioc0xYZyrIpbM6Wh6x",
    "secret_key"    :   "LVzZY2SqOQ_I_kM1n02ygACVBArDvOWtiLkDtKip",
    "bucket"        :   "if-pbl",
    "key_prefix"    :   "2016/03/08/",
    "ignore_dir"    :   true
}

那么,保存在空间中的文件名是:

2016/03/08/frog.png
2016/03/08/funny.png
2016/03/08/golang.png

由于sub1sub2里面的文件和上一个层级相同,默认会被忽略(通过默认不支持同名文件覆盖上传实现)