S3命令行工具:rclone、s3cmd、s5cmd、mc、S3Copy

概述

S3(Simple Storage Service)是AWS推出的对象存储服务,其HTTP REST API已成为整个行业的事实标准协议,几乎所有主流对象存储都宣称"兼容S3 API":

  • 公有云:阿里云OSS、腾讯云COS、华为云OBS、Cloudflare R2、Backblaze B2
  • 私有部署:MinIO、Ceph RGW、SeaweedFS
  • 混合存储:本地文件系统+S3网关(如versitygw)

命令行工具对比Web控制台

场景 Web控制台 CLI工具
单个文件上传/下载 ✅方便 可以,但杀鸡用牛刀
批量上传/同步 ❌低效/卡顿 ✅最高效
自动化定时任务 ❌无法做 ✅脚本+cron
CI/CD流水线集成
大规模数据迁移(TB级) ✅并发+断点续传
运维监控脚本

本文介绍几款CLI工具

复制代码
S3工具生态全景
├── 通用多协议同步工具		rclone(支持50+云存储)
├── 传统S3CLI工具		s3cmd(Python,老牌稳定)
├── MinIO生态客户端		mc(MinIO官方,体验最佳)
├── 极速并行CLI工具		s5cmd(Go,比aws-cli快40x)
├── S3API网关/适配层		versitygw(把任意存储变成S3)
├── 专项高效数据复制		S3Copy(断点续传,流式传输)

rclone

官网,开源(GitHub,57.6K Star,5.1K Fork)S3瑞士军刀,支持超过70种云存储后端,包括Google Drive、Dropbox、OneDrive、SFTP、FTP、WebDAV等。若需要在多种不同的存储之间同步/迁移数据,rclone几乎是唯一选择。

部分功能列表

功能 说明
sync 单向同步(类似rsync),源→目标,删除目标多余文件
copy 复制文件,不删除目标端已有内容
move 移动后删除源端文件
mount 将远端存储挂载为本地文件系统(FUSE)
serve 以HTTP/WebDAV/S3/SFTP等协议对外提供存储服务
bisync 双向同步(实验性功能)
ls/lsd/lsf 列出文件/目录
check 校验两端文件一致性(MD5/SHA1/ETag)
crypted remote 透明加密,文件在传输和存储时自动加密/解密
dedupe 重复文件检测与删除
size 统计远端存储使用量

安装

支持多种安装方式:

bash 复制代码
curl https://rclone.org/install.sh | sudo bash
brew install rclone
scoop install rclone
winget install Rclone.Rclone
docker run --rm \
	--volume ~/.config/rclone:/config/rclone \
	--volume ~/data:/data:shared \
	rclone/rclone ls remote:bucket

执行命令rclone config开启交互式配置,写文件~/.config/rclone/rclone.conf,支持直接编辑该文件,示例:

conf 复制代码
[mycos]
type = s3
provider = TencentCOS
access_key_id = AKIDxxxxxx
secret_access_key = xxxxxxxx
endpoint = cos.ap-beijing.myqcloud.com

命令行示例:

bash 复制代码
# 同步本地目录到S3(增量同步)
rclone sync /local/path remote:mybucket/prefix
# 并发上传
rclone copy /local/path remote:mybucket \
	--transfers 32 \
	--s3-upload-concurrency 8 \
	--progress
# 挂载S3为本地目录
rclone mount remote:mybucket /mnt/s3 --daemon
# 以S3协议对外暴露本地目录
rclone serve s3 /local/path --addr :9000
# 列出存储桶
rclone lsd remote:
# 校验文件一致性
rclone check /local/path remote:mybucket
# rclone透明加密同步
rclone copy remote:source crypt:destination
# 限速上传,适合生产环境,避免影响其他业务
rclone copy source: dest: --bwlimit 10M
# 只同步特定类型文件
rclone copy source: dest: --include "*.jpg" --include "*.png"
# 排除特定目录
rclone sync source: dest: --exclude ".git/**"
# 仅同步最近7天修改的文件
rclone copy source: dest: --max-age 7d

s3cmd

项目首页,开源(GitHub,4.9K Star,905 Fork)基于Python的S3命令行。

功能

命令 功能
mb/rb 创建/删除存储桶
ls 列出存储桶或对象
put/get 上传/下载单个文件
del 删除对象
sync 目录同步(类似rsync)
cp/mv S3内部复制/移动
info 查看对象元信息
setacl/getacl ACL权限管理
ws-create/ws-delete 静态网站托管配置
expire 设置对象生命周期规则
sign 生成预签名URL

实战

安装及配置

bash 复制代码
pip install s3cmd
brew install s3cmd
apt-get install s3cmd
# 交互式配置
s3cmd --configure

配置文件示例:

ini 复制代码
[default]
access_key = minioadmin
secret_key = minioadmin
host_base = localhost:9000
host_bucket = localhost:9000/%(bucket)s
use_https = False
signature_v2 = False

命令行示例:

bash 复制代码
# 创建存储桶
s3cmd mb s3://mybucket
# 上传文件
s3cmd put /local/file.txt s3://mybucket/path/file.txt
# 上传整个目录
s3cmd put -r /local/dir s3://mybucket/prefix/
# 增量同步,--delete删除目标端多余文件
s3cmd sync /local/dir s3://mybucket/prefix/ --delete
# 下载文件
s3cmd get s3://mybucket/file.txt /local/file.txt
# 生成1小时有效的预签名URL
s3cmd signurl s3://mybucket/file.txt +3600
# 设置ACL公开访问
s3cmd setacl s3://mybucket/file.txt --acl-public
# 列出所有存储桶
s3cmd ls
# 查看对象详情:ETag、大小、存储类等
s3cmd info s3://mybucket/file.txt

s5cmd

基于Go、开源(GitHub,4.1K Star,337 Fork)极速S3客户端,通过goroutine实现的高度并发执行引擎,在大量小文件操作场景下,性能可达到AWS CLI的32~40倍。

官方实测:整体性能最高提升40倍,s5cmd天生并发,而AWS CLI默认单线程。

测试场景 s5cmd AWSCLI 提升倍数
上传10,000个小文件 12秒 6分24秒 ~32x
下载100GB数据集 1分40秒 14分22秒 ~8.6x
列出并同步100万对象 48秒 11分09秒 ~13.9x

功能

功能 说明
高并发执行 数千goroutine并行处理,CPU利用率极高
通配符支持 多级glob模式(s3://bucket/logs/2024//*.log
批量命令文件 从文件读取命令序列批量执行(s5cmdruncommands.txt
Tab补全 内置Shell补全,包括桶名和路径提示
跨区域操作 自动处理不同区域的端点路由
零依赖 单一二进制,无需安装Python/Node等运行时

使用场景

  • ✅大规模数据迁移:10万+文件的批量迁移,效率吊打其他工具
  • ✅机器学习数据集处理:AI训练数据集的批量上传/下载,节省宝贵GPU等待时间
  • ✅CI/CD流水线:快速将构建产物推送到S3
  • ✅定时批量清理:配合cron实现大规模对象清理
  • ❌不适合需要多云/非S3存储的场景(仅支持S3兼容协议)
  • ❌不适合需要细粒度ACL/生命周期配置的场景(功能有限)

实战

安装

bash 复制代码
brew install peak/tap/s5cmd
go install github.com/peak/s5cmd/v2@latest

当然也支持从GitHub Release页面下载二进制安装程序。

命令示例

bash 复制代码
# 基础文件操作
s5cmd cp s3://source-bucket/file.txt s3://dest-bucket/file.txt
s5cmd cp /local/file.txt s3://mybucket/path/
s5cmd cp s3://mybucket/file.txt /local/
# 高并发同步(默认并发数 256)
s5cmd sync s3://source/prefix/ /local/dest/
# 上传整个目录(并发 512 个 worker)
s5cmd --numworkers 512 cp /local/dir/* s3://mybucket/prefix/
# 通配符批量下载
s5cmd cp "s3://mybucket/logs/2024/**/*.log" /local/logs/
# 批量删除
s5cmd rm "s3://mybucket/temp/*"
# 列出对象
s5cmd ls s3://mybucket/prefix/
# 从命令文件批量执行(适合复杂迁移任务)
cat commands.txt
# cp s3://source/file1.txt s3://dest/file1.txt
# cp s3://source/file2.txt s3://dest/file2.txt
# rm s3://old-bucket/deprecated-file.txt
s5cmd run commands.txt
# 查看桶列表
s5cmd ls
# 对象信息
s5cmd du s3://mybucket/prefix/

mc

MinIO官方开源(GitHub,3.5K Star,677 Fork) S3客户端,支持标准S3操作,还深度集成MinIO特有的企业功能(副本策略、加密、审计日志等)。

功能清单

命令组 功能
alias set/list/remove 管理多个S3端点别名
cp/mirror 复制/镜像(持续同步)
ls/find 列出/搜索对象
cat/pipe 流式读取对象内容
admin MinIO管理命令(仅MinIO可用)
policy 存储桶策略管理
tag 对象标签管理
stat 对象元信息
diff 比较两个桶的差异
watch 监听存储桶事件变化(实时)
event 配置事件通知
ilm 生命周期管理(Information Lifecycle Management)
quota 存储桶配额管理
replicate 跨区域复制配置

实战

安装

bash 复制代码
curl https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc && chmod +x /usr/local/bin/mc
brew install minio/stable/mc

还支持从GitHub Release页面下载二进制安装程序。

命令行示例

bash 复制代码
# 添加 S3 端点别名
mc alias set mycloud https://s3.amazonaws.com AKID SECRET
mc alias set myminio http://localhost:9000 minioadmin minioadmin
# 列出所有存储桶
mc ls mycloud
# 复制文件
mc cp /local/file.txt mycloud/mybucket/file.txt
# 持续镜像增量同步,类似rclone sync
mc mirror mycloud/source-bucket mycloud/dest-bucket
# 实时监听存储桶事件
mc watch myminio/mybucket
# 查找超过 30 天未访问的文件
mc find myminio/mybucket --older-than 30d
# 存储桶策略(设置公开只读)
mc policy set download myminio/mybucket
# MinIO 管理:查看集群状态
mc admin info myminio
# MinIO 管理:添加用户
mc admin user add myminio newuser newpassword
# MinIO 管理:设置副本
mc replicate add myminio/source-bucket --remote-bucket "https://user:pass@remote/dest-bucket"
# 流式读取(适合日志文件)
mc cat myminio/mybucket/app.log | grep ERROR

MinIO专属功能示例:

bash 复制代码
# 配置跨区域复制(Active-Active 模式)
mc replicate add myminio/primary \
    --remote-bucket "https://remote-minio/replica" \
    --replicate "delete,delete-marker,existing-objects"
# 设置加密(SSE-S3)
mc encrypt set SSE-S3 myminio/mybucket
# 查看存储桶统计
mc du myminio/mybucket
# 对象锁定(WORM - Write Once Read Many)
mc retention set --default COMPLIANCE 30d myminio/mybucket

S3Copy

开源(GitHub)命令行工具,专为高效复制数据到S3存储而设计。无论是从本地文件、HTTP URL还是其他S3存储,它都能提供快速、可靠的传输体验,并支持断点续传、分块上传等高级特性。

备注:新项目,仅由几个.go文件组成,学习或参考。

核心功能

  • 多源支持:本地文件/目录、HTTP/HTTPS URL、S3存储桶之间自由复制
  • 智能跳过:基于ETag自动跳过已存在的文件,避免重复传输:
    • 本地文件:计算MD5哈希值
    • S3对象:使用现有ETag
    • HTTP源:使用响应头中的ETag(如果有)
  • 分块上传:超过32MB的文件自动使用分块上传,提升大文件传输效率
  • 断点续传:传输中断后可从中断点继续,无需重新开始;只需再次运行相同命令即可恢复:
    1. 自动检测已传输的文件和分块
    2. 跳过已完成的文件
    3. 从中断的分块上传处继续
  • 并发操作:可配置的并发上传数量,充分利用带宽资源
  • 实时进度:每秒以JSON格式输出传输进度,便于监控
  • 内存优化:流式处理大文件,避免内存溢出问题,策略:
    • 分块流式传输:同时下载和上传,避免一次性加载整个文件
    • 内存控制:使用固定大小的缓冲区,避免内存堆积
    • 支持续传:可从中断点恢复下载
    • 高效缓冲:优化缓冲区使用,平衡性能和内存占用
  • 自动建桶:目标桶不存在时自动创建,简化操作流程
  • 智能重试:网络故障时自动重试,重试次数可配置;默认重试最多3次,每次间隔3秒。可通过--max-retries参数自定义重试次数。
  • 同源优化:同一账户和区域的S3复制使用CopyObject API,节省带宽并提高性能

工具能处理各种错误情况,所有错误都会记录详细信息,并更新内部状态以保持一致性:

  • 网络中断(带可配置的重试逻辑)
  • 认证错误
  • 权限问题
  • 大文件内存限制
  • 无效端点格式

性能优化提示

  • 并发上传:增加--T值提高吞吐量(需平衡系统资源)
  • 分块大小:larger分块减少API调用但增加内存使用
  • 网络选择:使用同一区域的端点以获得更好性能
  • 内存使用:工具设计为无论文件大小都使用最小内存
  • 重试设置:根据网络稳定性调整--max-retries
  • 同源复制:同一账户和区域内的S3到S3复制,工具会自动使用更高效的CopyObject API,节省带宽

安装:

bash 复制代码
npm install
go mod download
go build -o s3copy .

设置环境变量

bash 复制代码
# 源S3配置(从S3复制时需要)
export SRC_ACCESS_KEY=xx
export SRC_SECRET_KEY=xx
export SRC_S3_REGION=xx

# 目标S3配置(始终需要)
export DST_ACCESS_KEY=xx
export DST_SECRET_KEY=xx
export DST_S3_REGION=xx

备注:SRC_S3_REGIONDST_S3_REGION可选配置,默认us-east-1

命令行示例:

bash 复制代码
# 从本地文件/目录复制到S3
# 复制单个文件
s3copy --from-file /path/to/file.txt --to http://region.s3.com/oss1001
# 复制整个目录
s3copy --from-file /path/to/directory --to http://region.s3.com/oss1001
# 从URL复制到S3,一行一个可下载资源文件,支持http/https
s3copy --from-url urls.txt --to http://region.s3.com/oss1001
# 从S3复制到S3
s3copy --from-s3 http://oss1001.region.s4.comm --to http://region.s3.com/oss1001
# 使用自定义设置进行复制
s3copy --from-file /large-dataset \
	--to http://region.s3.com/backup \
	--T 20 \
	--part-size 67108864 \
	--max-retries 5 \
	-vv
参数 描述 默认值
--T 并发上传线程数量 10
--part-size 分块上传大小(字节) 33554432(32MB)
-q,--quiet 静默模式(无输出) false
-v,--verbose 增加日志详细程度 0
--max-retries 失败上传的重试次数 3

工具支持通过-v参数控制日志输出详细程度,不同级别的含义如下:

参数 日志级别 含义
不加-v ERROR/WARN 只输出错误或警告信息
-v INFO 输出主要流程信息(如"开始上传"、"完成下载")
-vv DEBUG 输出详细调试信息(如请求头、参数)
-vvv TRACE 输出最详细信息(如完整请求/响应体、堆栈)

端点格式支持

工具每秒以JSON格式输出进度:

json 复制代码
{
	"total_size": 1048576000,  // 总字节数
	"migrated_size": 524288000,
	"total_objects": 7,
	"migrated_objects": 2,
	"fail_objects": 0,
	"average_speed": 10485760,  // 字节/秒
	"progress": 50.00
}

对比及选型

工具 定位 S3以外协议 加密备份 挂载FS
rclone 通用多云同步 ✅70+ ✅(可选) ✅FUSE
s3cmd 老牌S3CLI ❌仅S3
mc MinIO生态客户端 ❌仅S3/MinIO
s5cmd 极速并行S3CLI ❌仅S3

选型决策树

复制代码
主要需求是什么?
├── 备份数据(需要版本历史/加密/快照)
│   └── → restic(加密备份首选)
├── 把S3当本地磁盘用(应用程序直接读写)
│   └── → goofys(高性能FUSE挂载)
│       └── 如果需要多云、非S3→rclone mount
├── 海量数据迁移、极速批量操作
│   └── → s5cmd(性能最高,比AWS CLI快40x)
│       └── 如果需要多云协议 → rclone
├── 已有本地存储,想暴露S3 API接口
│   └── → versitygw(S3网关,无需迁移数据)
├── 从多个 HTTP URL 批量下载并上传到 S3
│   └── → S3Copy(专为搬运场景设计)
├── 数据库MinIO,需要深度管理:用户副本、监控
│   └── → mc(MinIO官方客户端,功能最全)
├── 跨云迁移、需要支持多种非S3协议
│   └── → rclone(支持70+云存储,一工具走天下)
└── 老旧脚本维护,Python环境,需要ACL、生命周期等高级S3功能
    └── → s3cmd(功能成熟,Python生态友好)
相关推荐
亚林瓜子6 天前
AWS S3日志桶常用过期文件生命周期策略
云计算·生命周期·aws·s3·过期·glacier
分布式存储与RustFS2 个月前
MinIO 社区版 vs 企业版 vs RustFS:2026 全面拆解,AGPL 协议风险与信创适配必看
对象存储·s3·企业存储·rustfs·minio国产化替代·minio平替·国产对象存储rustfs
是萝卜干呀2 个月前
Minio 模拟S3云存储
minio·s3·模拟云存储
百里杨3 个月前
ACPI电源按钮唤醒S3切换到S0流程(附流程图)
s3·acpi·s0
百里杨3 个月前
ACPI休眠按钮触发S0切换到S3流程(附流程图)
s3·acpi·s0
亚林瓜子6 个月前
AWS中国云中的ETL之从aurora搬数据到s3(Glue版——修复版)
云计算·etl·aws·s3·glue
nicepainkiller6 个月前
aws s3 对象存储 上传文件
云计算·aws·s3
DevOps00810 个月前
将 RustFS 用作 GitLab 对象存储后端
rust·gitlab·minio·分布式存储·s3·rustfs
ApacheSeaTunnel1 年前
MySQL 数据同步至 S3file,并接入 Hive 访问:SeaTunnel 实践指南
大数据·mysql·开源·数据集成·s3·seatunnel·数据同步