七牛云存储使用 qshell 批量下载文件并打压缩包的方案

更新日期: 2025-06-09 阅读次数: 35 字数: 1043 分类: CDN

我使用☁️七牛云存储了一堆 pdf 文件,我想批量下载其中的一部分,打包成一个压缩包。 最好是不需要通过我的服务器中转,能在七牛云上直接完成。

qshell 还是 pfop mkzip

  • 通过七牛云官方命令行工具 qshell 实现本地批量下载+自动压缩,全程无需服务器中转。类似在 linux 终端里使用 wget 或者 curl 命令一样
  • 使用七牛云 mkzip 异步处理接口,直接在云端打包,生成压缩包后下载。但是官方的 mkzip 文档太简陋了,我没有找到怎么对文件改名的操作。而且,如果一个文件变更,整个压缩包都需要重新打包。这样成本太高。所以,我还是选择 qshell 来下载文件。

纠结了一下,发现还是 qshell 更适合我的需求。因为我需要下载的文件数量较多,而且需要对文件进行重命名的操作。 虽然,不能直接在云端打包,但是可以通过 qshell 下载到本地后,再进行打包操作。这样可以更灵活地处理文件名和目录结构, 以及后续的删除文件操作。

qshell 安装

因为公司的电脑安装了加密软件,下载到本地的 pdf 文件会被加密,导致无法直接打开。所以,我选择的 WSL 1 来下载 pdf 文件。所以,需要在 WSL 1 中安装 qshell。

下载地址:

https://developer.qiniu.com/kodo/1302/qshell

因为我 WSL 中安装的是 Ubuntu Server,所以下载 Linux amd64 的版本。

如果下载 Linux X86 版本,执行会报错:

cannot execute binary file: Exec format error

确认 qshell 安装完成:

$ qshell -v
qshell version v2.16.0

qshell 设置账号信息

account 命令用来设置当前用户的 AccessKey 和 SecretKey ,这对 Key 主要用在其他的需要授权的命令中,比如 stat , delete , listbucket2 命令中。 该命令设置的信息,经过加密保存在 HOME 目录下的 .qshell/account.json 文件中。

设置方法参考:

https://github.com/qiniu/qshell/blob/master/docs/account.md

qshell account [--overwrite | -w] <Your AccessKey> <Your SecretKey> <Your Account Name>

设置完成后,可以通过以下命令查看账号信息:

qshell account

qshell 下载指定文件

命令格式:

qshell get <Bucket> <Key> [-o <OutFile>]

参考:

https://github.com/qiniu/qshell/blob/master/docs/get.md

例如执行:

$ qshell get my_bucket_name dir1/dir2/hello.pdf

需要注意的是,如果不指定 o 参数,则本地的保存目录结构会和七牛云上的目录结构一致。

即,会在当前目录下创建 dir1/dir2 目录,并将 hello.pdf 保存到 dir2 目录下。

对于需要打包压缩的场景,我需要把所有目标文件都放到一个目录下,然后再打包压缩。 所以,还是指定 o 参数,将文件下载到当前目录下。

批量下载

我想通过 golang 遍历数据库中存储的 pdf 文件 key,生成 qshell 命令列表,然后执行这些命令。

特殊符号转义

文件名中可能包含特殊符号,例如括号、空格等,这些符号在命令行中可能会导致:

  • 语法错误 (括号导致)
  • 找不到文件 (空格导致)

syntax error near unexpected token `('

这本质上是 linux shell 的转义问题,可以使用单引号完全禁用所有特殊字符。 单引号内部内容会按字面意义解析,无转义、无变量替换。例如:

$ qshell get my_bucket_name 'dir1/dir2/hello work(1).pdf' -o 'hello world.pdf'

唯一的问题是,需要防止原始文件名中包含单引号。好在还没有遇到。

执行

将导出的 qshell 命令列表保存到一个脚本文件中,然后执行:

$ chmod +x download.sh
$ ./download.sh

统计文件数量

> ls | wc -l
1024

打包

zip -r my_archive.zip my_folder/

再次上传七牛云

为了方便客户下载,我将打包好的 zip 文件再次上传到七牛云。

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式