七牛云存储qshell命令

下载qshell

$ wget https://kodo-toolbox-new.qiniu.com/qshell-v2.15.0-linux-386.tar.gz
$ tar -xvf qshell-v2.15.0-linux-386.tar.gz
$ mv qshell /usr/bin/
$ chmod +x /usr/bin/qshell

1. account

1.1 设置当前用户的 AccessKey, SecretKey, Name

qshell account ELUs327kxVPJrGCXqWae9yioc0xYZyrIpbM6Wh6x LVzZY2SqOQ_I_kM1n00ygACVBArDvOWtiLkDtKiw name_test

1.2 输出当前用户设置的 AccessKey 和 SecretKey

qshell account

输出:

Name: name_test
AccessKey: ELUs327kxVPJrGCXqWae9yioc0xYZyrIpbM6Wh6x
SecretKey: LVzZY2SqOQ_I_kM1n00ygACVBArDvOWtiLkDtKiw

1.3 我们可以在设置 name_test 账户后,继续添加一个账户。

qshell account ELUs327kxVPJrGCXqWae9yioc0xYZyrIpbM6abc LVzZY2SqOQ_I_kM1n00ygACVBArDvOWtiLkDthaha name_test2

qshell 可以记录多个设置的账户信息,账户的管理、切换、删除等,可以参考 qshell user 自命令文档

2. user

  1. 添加账号

//  --ak:七牛账号对应的 AccessKey [获取](https://portal.qiniu.com/user/key) 。【必选】
//  --sk:七牛账号对应的 SecretKey [获取](https://portal.qiniu.com/user/key) 。【必选】
//  --name:AccessKey 和 SecretKey 对的 id, 可以任意取,但同一台机器此 id 不可重复;和在七牛注册的邮箱信息没有关系, 只是 qshell 本地用来标示 <ak, sk> 对。【必选】

qshell user add --ak ELUs327kxVPJrGCXqWae9yioc0xYZyrIpbM6Wh6x --sk LVzZY2SqOQ_I_kM1n00ygACVBArDvOWtiLkDtKiw --name name_test
  1. 清除本地数据库

qshell user clean // 注:仅仅清除本地数据库,会保留当前账户
  1. 切换当前的账户

qshell user cu       // 切换至上一次使用的账户
qshell user cu test  // 切换到 `test` 账号,`test` 为 ak,sk 对的 id
  1. 列举本地所有的账号信息

qshell user ls
  1. 输出某个账户信息

qshell user lookup test // `test` 为 ak,sk 对的 id
  1. 删除 test 账号

qshell user remove test //  `test` 为 ak,sk 对的 id

3. listbucket

1 获取空间 if-pbl 里面的所有文件列表:

qshell listbucket if-pbl -o if-pbl.list.txt

2 获取空间 if-pbl 里面的以 2014/10/07/ 为前缀的文件列表:

qshell listbucket if-pbl --prefix '2014/10/07/' -o if-pbl.prefix.list.txt

结果:

hello.jpg	1710619	FlUqUK7zqbqm3NPwzq2q7TMZ-Ijs	14209629320769140	image/jpeg  1
hello.mp4	8495868	lns2dAHvO0qYseZFgDn3UqZlMOi-	14207312835630132	video/mp4   0
hhh	1492031	FjiRl_U0AeSsVCHXscCGObKyMy8f	14200176147531840	image/jpeg  1
jemygraw.jpg	1900176	FtmHAbztWfPEqPMv4t4vMNRYMETK	14208960018750329	application/octet-stream	1   QiniuAndroid

4. mkbucket

在华北区域创建名为 my-bucket 的私有空间

$ qshell mkbucket my-bucket --region z1 --private

5. qupload2

qupload2 功能和 qupload 一致,不过 qupload2 通过命令行的方式来指定各个需要的参数,例如:

qshell qupload2 --src-dir=/home/jemy/temp --bucket=test

如果需要指定上传到 test空间的 one目录

qshell qupload2 --src-dir=/home/jemy/temp --bucket=test --key-prefix=one/

6. qdownload2

qdownload2 功能和 qdownload 一致,选项也是一一对应,不过 qdownload2 通过命令行的方式来指定各个需要的参数,例如:

qshell qdownload2 --dest-dir=/home/jemy/temp --bucket=test

7. fput

fput 命令用来以 multipart/form-data 的表单方式上传一个文件。适合于中小型文件的上传,一般建议如果文件大小超过 100MB 的话,都使用分片上传。

1 上传本地文件 /Users/jemy/Documents/qiniu.jpg 到空间 if-pbl 里面。

$ qshell fput if-pbl qiniu.jpg /Users/jemy/Documents/qiniu.jpg

2 上传本地文件 /Users/jemy/Documents/qiniu.jpg 到空间 if-pbl 里面,带前缀 2015/01/18/,并且指定 MimeType 参数为 image/jpg

$ qshell fput if-pbl 2015/01/18/qiniu.jpg /Users/jemy/Documents/qiniu.jpg --mimetype image/jpg

3 覆盖上传 qiniu.mp4 到空间 if-pbl

$ qshell fput if-pbl 2015/01/18/qiniu.jpg /Users/jemy/Documents/qiniu.jpg --overwrite

5 使用低频存储

$ qshell fput if-pbl 2015/01/18/qiniu.jpg /Users/jemy/Documents/qiniu.jpg --file-type 1

8. rput

1 上传本地文件 /Users/jemy/Documents/qiniu.mp4 到空间 if-pbl 里面。

// 使用使用分片上传 API V1
$ qshell rput if-pbl qiniu.mp4 /Users/jemy/Documents/qiniu.mp4

// 使用使用分片上传 API V2
$ qshell rput if-pbl qiniu.mp4 /Users/jemy/Documents/qiniu.mp4 --resumable-api-v2

2 上传本地文件 /Users/jemy/Documents/qiniu.mp4 到空间 if-pbl 里面,带前缀 2015/01/18/,并且指定 MimeType 参数为 video/mp4

$ qshell rput if-pbl 2015/01/18/qiniu.mp4 /Users/jemy/Documents/qiniu.mp4 --mimetype video/mp4

3 覆盖上传 qiniu.mp4 到空间 if-pbl

$ qshell rput if-pbl 2015/01/18/qiniu.jpg /Users/jemy/Documents/qiniu.jpg --overwrite

4 使用低频存储

$ qshell rput if-pbl 2015/01/18/qiniu.jpg /Users/jemy/Documents/qiniu.jpg --file-type 1

9. batchcopy

1 我们将空间 if-pbl 中的一些文件复制到 if-pri 空间中去。如果是希望原文件名和目标文件名相同的话,可以这样指定 SrcDestKeyMapFile 的内容:

data/2015/02/01/bg.png
data/2015/02/01/pig.jpg

将上述内容保存到名为 tocopy.txt 的文件中。然后使用如下命令就可以把上面的文件以和原来文件相同的文件名从 if-pbl 复制到 if-pri 了。

$ qshell batchcopy if-pbl if-pri -i tocopy.txt

2 如果上面希望在复制的时候,对一些文件进行重命名,那么 SrcDestKeyMapFile 内容可以是这样:

data/2015/02/01/bg.png	background.png
data/2015/02/01/pig.jpg

从上面我们可以看到,你可以为你希望重命名的文件设置一个新的名字,不希望改变的就不用指定。然后使用命令就可以将文件复制过去了。

$ qshell batchcopy if-pbl if-pri -i tocopy.txt

3 如果不希望上面的复制过程出现验证码提示,可以使用 --force 选项:

$ qshell batchcopy --force if-pbl if-pri -i tocopy.txt

4 如果目标空间存在同名的文件,可以使用 --overwrite 选项来强制覆盖:

$ qshell batchcopy --force --overwrite if-pbl if-pri -i tocopy.txt

10. batchdelete

1 删除空间 if-pbl 下的某些文件,指定要删除的文件列表 todelete.txt 进行删除,其内容如下:

a.jpg
test/b.jpg

执行如下命令:

$ qshell batchdelete if-pbl -i todelete.txt

2 删除空间 if-pbl 中的所有文件:

// 先列举空间:if-pbl,列举结果保存在文件 if-pbl.list.txt 中
$ qshell listbucket if-pbl -o if-pbl.list.txt
// 再根据 if-pbl.list.txt 进行删除
$ qshell batchdelete --force if-pbl -i if-pbl.list.txt

3 如果希望导出成功和失败的文件列表

$ qshell batchdelete if-pbl -i if-pbl.list.txt --success-list success.txt --failure-list failure.txt

4 对于要删除的文件名字包含了空格的情况, 那么可以指定自定义的分隔符对文件每行进行分割, 假如使用 \t 进行分割

$ qshell batchdelete -F '\t' if-pbl -i todelete.txt

11. batchmove

1 我们将空间 if-pbl 中的一些文件移动到 if-pri 空间中去。如果是希望原文件名和目标文件名相同的话,可以这样指定 SrcDestKeyMapFile 的内容:

data/2015/02/01/bg.png
data/2015/02/01/pig.jpg

然后使用如下命令就可以以和原来相同的文件名从 if-pbl 移动到 if-pri 了。

$ qshell batchmove if-pbl if-pri -i tomove.txt

2 如果上面希望在移动的时候,对一些文件进行重命名,那么 SrcDestKeyMapFile 可以是这样:

data/2015/02/01/bg.png	background.png
data/2015/02/01/pig.jpg

从上面我们可以看到,你可以为你希望重命名的文件设置一个新的名字,不希望改变的就不用指定。

$ qshell batchmove if-pbl if-pri -i tomove.txt

3 如果不希望上面的移动过程出现验证码提示,可以使用 --force 选项:

$ qshell batchmove --force if-pbl if-pri -i tomove.txt

4 如果目标空间存在同名的文件,可以使用 --overwrite 选项来强制覆盖:

$ qshell batchmove --force --overwrite if-pbl if-pri -i tomove.txt

12. batchrename

1 比如我们要将空间 if-pbl 里面的一些文件进行重命名,我们可以指定如下的 OldNewKeyMapFile 的内容:

2015/03/22/qiniu.png	test/qiniu.png
2015/photo.jpg	test/photo.jpg

上面,我们将 2015/03/22/qiniu.png 重命名为 test/qiniu.png,诸如此类。 把这个内容保存到文件 torename.txt 中,然后使用如下的命令将所有的文件进行重命名。

$ qshell batchrename if-pbl -i torename.txt

2 如果不希望上面的重命名过程出现验证码提示,可以使用 --force 选项:

$ qshell batchrename --force if-pbl -i torename.txt

3 对于重新命名的过程中,希望导入成功失败的文件,可以这样导出

$ qshell batchrename if-pbl -i torename.txt --success-list success.txt --failure-list failure.txt

13. qdownload

qdownload 可以将七牛空间中的文件同步到本地磁盘中。支持只同步带特定前缀或者后缀的文件,也支持在本地备份路径不变的情况下进行增量同步。 需要额外指出的是,将文件同步到本地都是走的七牛存储源站的流量而不是 CDN 的流量,因为 CDN 通常情况下会认为大量的文件下载操作是非法访问从而进行限制。

需要同步空间 qdisk 中的所有以 movies/ 开头(理解为前缀的概念,那么 movies/1.mp4, movies/2.mp4 等以 movies/ 为前缀的文件都会被下载保存),并以 .mp4 结尾的文件到本地路径 /Users/jemy/Temp7/backup 下面;把下面的配置内容写入配置文件 qdisk_down.conf,该配置文件需要自行创建:

{
	"dest_dir"	:	"/Users/jemy/Temp7/backup",
	"bucket"	:	"qdisk",
	"domain"    :   "if-pbl.qiniudn.com",
	"prefix"	:	"movies/",
	"suffixes"	:	".mp4",
	"check_hash"    :   false
}

运行命令(下载并发数表示可以同时下载 10 个文件):

qshell qdownload -c 10 qdisk_down.conf

key_file 文件格式: 每行一个 key, 且仅有 key 的内容,除 key 外不能有其他字符。

save_path_handler 说明

save_path_handler 函数中可使用的文件参数有:

  • Key: 文件的在七牛云存储的 Key 值

  • DestDir: 下载配置的保存路径

  • ToFile: 默认的下载路径

  • ServerFileSize: 文件的在七牛云存储的大小

  • ServerFileHash: 文件的在七牛云存储的 Etag

  • ServerFilePutTime: 文件的在七牛云存储的上传时间

save_path_handler 常见示例:

1. 在不配置 save_path_handler 时,文件保存路径的构造方式为:
$dest_dir + $文件分割符 + $Key


2. 配置 save_path_handler ,使在构造文件保存路径时,去除 Key 中一部分前缀 a/:
save_path_handler 配置:"{{pathJoin .DestDir (trimPrefix \"a/\" .Key)}}"
pathJoin:路径拼接函数
.DestDir:对应配置文件中的 dest_dir,假设配置为:"/user/lala/"
trimPrefix:截掉字符串头函数,trimPrefix \"a/\" .Key 表示:将文件 Key 的 "a/" 截掉
.Key:表示文件的 Key,假设为:"a/b/hello.png"
上面信息最终构造的文件路径为:"/user/lala/b/hello.png"

如果需要验证 save_path_handler 配置是否符合预期,可使用 func 命令。
参数部分:'{"Key": "a/b/hello.png", "DestDir": "/user/lala/"}',这部分信息在 download 时会自动生成并作为回调函数的参数,用户不用关心。
回调函数 save_path_handler : "{{pathJoin .DestDir (trimPrefix \"a/\" .Key)}}"
验证:
$qshell func '{"Key": "a/b/hello.png", "DestDir": "/user/lala/"}' "{{pathJoin .DestDir (trimPrefix \"a/\" .Key)}}"
输出:
[W]  output is insert [], and you should be careful with spaces etc.
[I]  [/user/lala/b/hello.png]


3. 自定义文件下载后的保存路径:$DestDir + $文件分割符 + ($Key 首部 a/ 替换成 newA/)
save_path_handler 配置: "{{pathJoin .DestDir \"newA\" (trimPrefix \"a/\" .Key)}}"
pathJoin:路径拼接函数
.DestDir:对应配置文件中的 dest_dir,假设配置为:"/user/lala/"
trimPrefix:截掉字符串头函数,trimPrefix \"a/\" .Key 表示:将文件 Key 的 "a/" 截掉
.Key:表示文件的 Key,假设为:"a/b/hello.png"
最终文件的保存路径为:
/user/lala/newA/b/hello.png

验证:
$qshell func '{"Key": "a/b/hello.png", "DestDir": "/user/lala/"}' "{{pathJoin .DestDir \"newA\" (trimPrefix \"a/\" .Key)}}"
[W]  output is insert [], and you should be careful with spaces etc.
[I]  [/user/lala/newA/b/hello.png]