关于 s5cmd
s5cmd 是一个高性能的命令行工具,用于与 Amazon S3 交互。支持批量操作、并行传输和脚本化工作流,比原生 AWS 工具更快。
主要功能
- 01并行上传和下载 S3 文件,大幅加快传输速度
- 02列出、复制、删除和同步 S3 存储桶中的对象
- 03支持通配符和批量操作处理多个文件
- 04与本地文件系统和远程 S3 之间传输数据
适用场景
- 01自动化 CI/CD 流程中的工件存储和检索
- 02大规模批量管理云存储中的数据
- 03编码 Agent 快速访问和操作 S3 资源
安装
选择你的系统或包管理器,复制命令到终端运行。
安装完成后运行s5cmd --version确认安装成功。
命令示例
常用命令按使用顺序排列。
详细介绍

概述
s5cmd 是一款速度极快的 S3 和本地文件系统执行工具。它支持多种操作,
包括制表符补全和文件通配符支持,这在处理大量文件时,对于对象存储工作流
非常实用。
目前已有其他用于操作 S3 和类似对象存储服务的实用工具,因此很自然会想知道
s5cmd 有什么独特之处。
简而言之,s5cmd 的速度非常快。
感谢 Joshua Robinson 对 s5cmd 的
研究与实验。引用他的 Medium 文章:
对于上传,s5cmd 的速度比 s3cmd 快 32 倍,比 aws-cli 快 12 倍。 对于下载,s5cmd 可以跑满 40 Gbps 的链路(约 4.3 GB/s),而 s3cmd 和 aws-cli 分别只能达到 85 MB/s 和 375 MB/s。
如需进一步了解 s5cmd 的性能及其速度如此之快的原因,请参阅
基准测试部分
功能

s5cmd 支持云存储服务和本地文件系统的各种对象管理任务。
- 列出存储桶和对象
- 上传、下载或删除对象
- 移动、复制或重命名对象
- 使用 AWS Key Management Service(KMS)设置服务器端加密
- 在上传、复制和移动时,为对象/文件设置访问控制列表(ACL)
- 将对象内容输出到标准输出
- 使用 SQL 表达式从对象中筛选 JSON 记录
- 创建或删除存储桶
- 汇总对象大小,并按存储类别分组
- 所有操作均支持通配符
- 删除操作支持多个参数
- 支持命令文件,可用极高的执行速度批量运行命令
- 支持试运行
- 支持 S3 Transfer Acceleration
- 支持 Google Cloud Storage(以及任何其他兼容 S3 API 的服务)
- 提供结构化日志,便于查询命令输出
- Shell 自动补全
- 兼容旧版 S3 ListObjects API
安装
官方发行版
二进制文件
Releases 页面提供适用于 Linux、macOS 和 Windows 的 预构建二进制文件。
Homebrew
macOS 用户可使用 homebrew tap:
brew install peak/tap/s5cmd
非官方发行版(由社区维护)
警告 这些发行版由社区维护,与官方发行版相比可能不是最新版本。
MacPorts
你也可以在 macOS 上通过 MacPorts 安装 s5cmd:
sudo port selfupdate
sudo port install s5cmd
Conda
s5cmd 已收录在 conda-forge channel 中,可通过 Conda 下载。
可通过将
conda-forge添加到 channels 来从conda-forgechannel 安装s5cmd:conda config --add channels conda-forge conda config --set channel_priority strict启用
conda-forgechannel 后,可使用conda安装s5cmd:conda install s5cmd
附注:引自 s5cmd feedstock。你也可以在其 README 中找到更多说明。
FreeBSD
在 FreeBSD 上,你可以将 s5cmd 作为软件包安装:
pkg install s5cmd
或通过 ports 安装:
cd /usr/ports/net/s5cmd
make install clean
从源代码构建
如果已安装 Go 1.19+,可以从源代码构建 s5cmd。
go install github.com/peak/s5cmd/v2@master
⚠️ 请注意,从 master 构建不保证稳定,因为开发工作在 master 分支进行。
Docker
Hub
$ docker pull peakcom/s5cmd
$ docker run --rm -v ~/.aws:/root/.aws peakcom/s5cmd <S3 operation>
ℹ️ /aws 目录是镜像的工作目录。将当前工作目录挂载到该目录后,即可像在系统中安装了 s5cmd 一样运行它;
docker run --rm -v $(pwd):/aws -v ~/.aws:/root/.aws peakcom/s5cmd <S3 operation>
构建
$ git clone https://github.com/peak/s5cmd && cd s5cmd
$ docker build -t s5cmd .
$ docker run --rm -v ~/.aws:/root/.aws s5cmd <S3 operation>
用法
s5cmd 支持所有 S3 操作使用多层通配符。实现方式是:先列出前缀截至第一个通配符的所有 S3 对象,然后在内存中过滤结果。例如,对于以下命令:
s5cmd cp 's3://bucket/logs/2020/03/*' .
首先会发送一个 ListObjects 请求,然后并行对每个匹配的对象执行复制操作。
指定凭证
s5cmd 使用官方 AWS SDK 访问 S3。SDK 需要凭证来对发往 AWS 的请求进行签名。可通过多种方式提供凭证:
-
使用命名配置文件的命令行选项
--profile,以及使用指定凭证文件的标志--credentials-file# 使用 AWS 默认凭证文件中的公司配置文件 s5cmd --profile my-work-profile ls s3://my-company-bucket/ # 使用你自己的凭证文件中的公司配置文件 s5cmd --credentials-file ~/.your-credentials-file --profile my-work-profile ls s3://my-company-bucket/ -
环境变量
# 导出你的 AWS 访问密钥和秘密密钥 export AWS_ACCESS_KEY_ID='<your-access-key-id>' export AWS_SECRET_ACCESS_KEY='<your-secret-access-key>' export AWS_PROFILE='<your-profile-name>' export AWS_REGION='<your-bucket-region>' s5cmd ls s3://your-bucket/ -
如果
s5cmd在 Amazon EC2 实例上运行,则使用 EC2 IAM 角色 -
如果
s5cmd在 EKS 上运行,则使用 Kube IAM 角色 -
也可以使用
--no-sign-request选项匿名发送请求# 列出公共存储桶中的对象 s5cmd --no-sign-request ls s3://public-bucket/
区域检测
执行命令时,s5cmd 按以下优先级顺序检测区域:
cp命令的--source-region或--destination-region标志。AWS_REGION环境变量。- AWS 配置文件的区域部分。
- 根据存储桶区域自动检测(通过
HeadBucketAPI 调用)。 - 默认区域
us-east-1。
示例
检查存储桶是否存在
s5cmd head s3://bucket/
打印远程对象的元数据
s5cmd head s3://bucket/object.gz
下载单个 S3 对象
s5cmd cp s3://bucket/object.gz .
下载多个 S3 对象
假设我们有以下对象:
s3://bucket/logs/2020/03/18/file1.gz
s3://bucket/logs/2020/03/19/file2.gz
s3://bucket/logs/2020/03/19/originals/file3.gz
s5cmd cp 's3://bucket/logs/2020/03/*' logs/
s5cmd 会通过高效搜索给定前缀来匹配指定的通配符和参数。所有匹配的对象都会并行下载。如果目标目录不存在,s5cmd 会创建该目录。
logs/ 目录内容如下:
$ tree
.
└── logs
├── 18
│ └── file1.gz
└── 19
├── file2.gz
└── originals
└── file3.gz
4 directories, 3 files
ℹ️ 默认情况下,s5cmd 会保留源目录结构。如果要扁平化源目录结构,请使用 --flatten 标志。
s5cmd cp --flatten 's3://bucket/logs/2020/03/*' logs/
logs/ 目录内容如下:
$ tree
.
└── logs
├── file1.gz
├── file2.gz
└── file3.gz
1 directory, 3 files
将文件上传到 S3
s5cmd cp object.gz s3://bucket/
通过设置文件的服务器端加密(aws kms):
s5cmd cp -sse aws:kms -sse-kms-key-id <your-kms-key-id> object.gz s3://bucket/
通过设置对象的访问控制列表(acl)策略:
s5cmd cp -acl bucket-owner-full-control object.gz s3://bucket/
将多个文件上传到 S3
s5cmd cp directory/ s3://bucket/
这会将指定目录中的所有文件上传到 S3,同时保留源目录的文件夹层级。
将标准输入流式传输到 S3
你可以通过将标准输入传递给 s5cmd 来上传远程对象:
curl https://github.com/peak/s5cmd/ | s5cmd pipe s3://bucket/s5cmd.html
你也可以在上传前压缩数据:
gzip -c file | s5cmd pipe s3://bucket/file.gz
删除 S3 对象
s5cmd rm s3://bucket/logs/2020/03/18/file1.gz
删除多个 S3 对象
s5cmd rm 's3://bucket/logs/2020/03/19/*'
这会删除所有匹配的对象:
s3://bucket/logs/2020/03/19/file2.gz
s3://bucket/logs/2020/03/19/originals/file3.gz
s5cmd 使用 S3 批量删除 API。如果匹配的对象不超过 1000 个,它们会在单个请求中删除。不过请注意,像下面这样的命令:
s5cmd rm s3://bucket-foo/object s3://bucket-bar/object
s5cmd 不支持此类命令,并会报错(因为涉及两个不同的存储桶),这与执行批量删除请求的优势相悖。因此,如有需要,可以使用 s5cmd run 模式处理这种情况,即:
$ s5cmd run
rm s3://bucket-foo/object
rm s3://bucket-bar/object
有关 s5cmd run 的更多详情和示例,请参阅后续章节。
将对象从 S3 复制到 S3
s5cmd 也支持在服务器端复制对象。
s5cmd cp 's3://bucket/logs/2020/*' s3://bucket/logs/backup/
这会将所有匹配的对象复制到指定的 S3 前缀,并保留源文件夹层级。
⚠️ 目前还不支持复制大于 5GB 的对象(从 S3 到 S3)。我们已创建一个待处理问题来跟踪此问题。
使用排除和包含筛选器
s5cmd 支持 --exclude 和 --include 标志,可用于指定要在命令中排除或包含的对象模式。
--exclude标志用于指定应从操作中排除的对象。任何匹配该模式的对象都会被跳过。--include标志用于指定应纳入操作的对象。只有匹配该模式的对象才会被处理。- 如果同时使用两个标志,
--exclude的优先级高于--include。这意味着,如果对象 URL 匹配任何--exclude模式,即使它也匹配某个--include模式,该对象仍会被跳过。 - 标志的顺序不会影响结果(与
aws-cli不同)。
下面的命令只会删除以 .log 结尾的对象。
s5cmd rm --include "*.log" 's3://bucket/logs/2020/*'
下面的命令会删除除以 .log 或 .txt 结尾的对象之外的所有对象。
s5cmd rm --exclude "*.log" --exclude "*.txt" 's3://bucket/logs/2020/*'
如有需要,可以像下面这样使用多个标志。此命令会下载以 request 开头或以 .log 结尾的对象。
s5cmd cp --include "*.log" --include "request*" 's3://bucket/logs/2020/*' .
也可以组合使用 --include 和 --exclude。下面的命令只会同步以 .log 或 .txt 结尾、但不以 access_ 开头的对象。例如,request.log 和 license.txt 会被纳入,而 access_log.txt 和 readme.md 会被排除。
s5cmd sync --include "*.log" --exclude "access_*" --include "*.txt" 's3://bucket/logs/*' .
使用 SQL 查询 JSON 对象内容
s5cmd 支持 SelectObjectContent S3 操作,并会对匹配常规通配符语法的对象执行SQL 查询,通过标准输出输出匹配的 JSON 记录。来自多个对象的记录会交错输出,且不保证记录的顺序(不过,来自同一对象的记录很可能会按顺序到达,即使它们与其他记录交错输出)。
$ s5cmd select --compression GZIP \
--query "SELECT s.timestamp, s.hostname FROM S3Object s WHERE s.ip_address LIKE '10.%' OR s.application='unprivileged'" \
s3://bucket-foo/object/2021/*
{"timestamp":"2021-07-08T18:24:06.665Z","hostname":"application.internal"}
{"timestamp":"2021-07-08T18:24:16.095Z","hostname":"api.github.com"}
目前,此操作仅支持使用 SQL 查询 JSON 记录。S3 将其称为 lines-type JSON,但即使记录未按行分隔,似乎也能正常工作。效果因情况而异。
统计对象数量并确定总大小
$ s5cmd du --humanize 's3://bucket/2020/*'
30.8M bytes in 3 objects: s3://bucket/2020/*
并行运行多个命令
s5cmd 最强大的功能是命令文件。数千条 S3 和文件系统命令可以写入文件(或直接从另一个进程通过管道传入),并由多个并行工作进程执行。由于只启动一个程序,因此可以避免数千次不必要的 fork-exec 调用。这样,S3 的执行速度可达到每秒数千次操作。
s5cmd run commands.txt
或
cat commands.txt | s5cmd run
commands.txt 的内容可能如下所示:
cp 's3://bucket/2020/03/*' logs/2020/03/
# line comments are supported
rm s3://bucket/2020/03/19/file2.gz
# empty lines are OK too like above
# rename an S3 object
mv s3://bucket/2020/03/18/file1.gz s3://bucket/2020/03/18/original/file.gz
同步
sync 命令可在 S3 存储桶和前缀、目录和文件之间进行同步,也可在 S3 存储桶和前缀之间进行同步。
它会比较源和目标中的文件,并将源文件视为权威来源;
- 复制目标中不存在的文件
- 如果同步策略的比较结果允许,则复制两处都存在的文件
它会从源到目标进行单向同步,不会修改任何源文件,也不会删除任何目标文件(除非传入了 --delete 标志)。
假设我们有以下文件;
- 29 Sep 10:00 .
5000 29 Sep 11:00 ├── favicon.ico
300 29 Sep 10:00 ├── index.html
50 29 Sep 10:00 ├── readme.md
80 29 Sep 11:30 └── styles.css
s5cmd ls s3://bucket/static/
2021/09/29 10:00:01 300 index.html
2021/09/29 11:10:01 10 readme.md
2021/09/29 10:00:01 90 styles.css
2021/09/29 11:10:01 10 test.html
运行后会;
- 复制
favicon.ico- 目标中不存在该文件。
- 复制
styles.css- 源文件比远程对应文件新。
- 复制
readme.md- 尽管源文件更旧,但它的大小与目标文件不同;假定源文件是权威来源。
s5cmd sync . s3://bucket/static/
cp favicon.ico s3://bucket/static/favicon.ico
cp styles.css s3://bucket/static/styles.css
cp readme.md s3://bucket/static/readme.md
使用 --delete 标志运行会删除源中不存在的文件;
s5cmd sync --delete . s3://bucket/static/
rm s3://bucket/test.html
cp favicon.ico s3://bucket/static/favicon.ico
cp styles.css s3://bucket/static/styles.css
cp readme.md s3://bucket/static/readme.md
也可以使用通配符,仅同步文件的一个子集。
要将上方 S3 存储桶中的 .html 文件同步到相同的本地文件系统;
s5cmd sync 's3://bucket/static/*.html' .
cp s3://bucket/prefix/index.html index.html
cp s3://bucket/prefix/test.html test.html
我们暂不支持在两个存储端点之间直接同步。当前的解决方案是先将远程对象同步到本地磁盘,再将本地文件同步到目标远程存储。例如,如果要同步 S3 和 Google Cloud Storage:
s5cmd sync 's3://s3-bucket/path/*' download_folder/
s5cmd --endpoint-url <gcs-endpoint> sync 'download_folder/*' s3://gcs-bucket/path/
策略
默认
默认情况下,s5cmd 会比较文件的大小和修改时间,并将源文件视为权威来源。大小或修改时间有任何差异,s5cmd 都会将源对象复制到目标。
| 修改时间 | 大小 | 是否应同步 |
|---|---|---|
| src > dst | src != dst | ✅ |
| src > dst | src == dst | ✅ |
| src <= dst | src != dst | ✅ |
| src <= dst | src == dst | ❌ |
仅比较大小
使用 --size-only 标志,可以采用仅比较文件大小的策略。源被视为事实来源,任何大小差异都会导致 s5cmd 将源对象复制到目标位置。
| 修改时间 | 大小 | 是否应同步 |
|---|---|---|
| src > dst | src != dst | ✅ |
| src > dst | src = dst | ❌ |
| src <= dst | src != dst | ✅ |
| src <= dst | src == dst | ❌ |
模拟运行
--dry-run 标志会输出将要执行的操作,而不会实际
执行这些操作。
s3://bucket/pre/file1.gz
...
s3://bucket/last.txt
运行
s5cmd --dry-run cp s3://bucket/pre/* s3://another-bucket/
将输出
cp s3://bucket/pre/file1.gz s3://another-bucket/file1.gz
...
cp s3://bucket/pre/last.txt s3://anohter-bucket/last.txt
但不会执行这些复制操作。它会显示不使用 --dry-run 运行时
s5cmd 将执行的操作。
请注意,--dry-run 可用于任何具有副作用的操作,例如:
cp、mv、rm、mb……
S3 ListObjects API 向后兼容性
--use-list-objects-v1 标志会强制使用 S3 ListObjectsV1 API。此
标志适用于不支持 ListObjectsV2 API 的服务。
s5cmd --use-list-objects-v1 ls s3://bucket/
Shell 自动补全
支持 bash、pwsh(PowerShell)和 zsh 的 Shell 补全。
运行 s5cmd --install-completion 可获取适用于你的 Shell 的自动补全脚本。请注意,install-completion 不会安装自动补全,而只会提供安装说明。为保持向后兼容性,保留了这个名称。
要实际启用自动补全:
在 bash 和 zsh 中:
应将自动补全脚本添加到 .bashrc 和 .zshrc 文件中。
在 pwsh 中:
应将自动补全脚本保存到名为 s5cmd.ps1 的文件中,并将该文件的完整路径添加到配置文件中(可通过 $profile 查找该文件)
最后,重启 Shell 以启用更改。
注意 环境变量
SHELL必须准确设置,自动补全才能正常工作。也就是说,在 bash 中它应指向bash二进制文件,在 zsh 中应指向zsh二进制文件,在 PowerShell 中应指向pwsh二进制文件。
注意 自动补全已使用以下 Shell 版本进行测试:
zsh 5.8.1(x86_64-apple-darwin21.0)
GNU bash,版本 5.1.16(1)-release(x86_64-apple-darwin21.1.0)
PowerShell 7.2.6
Google Cloud Storage 支持
s5cmd 支持兼容 S3 API 的服务,例如 GCS、Minio 或你喜欢的
对象存储服务。
s5cmd --endpoint-url https://storage.googleapis.com ls
或使用环境变量的替代方式
S3_ENDPOINT_URL="https://storage.googleapis.com" s5cmd ls
# 或
export S3_ENDPOINT_URL="https://storage.googleapis.com"
s5cmd ls
以上所有方式都会返回你的 GCS 存储桶。
s5cmd 会读取 .aws/credentials 以访问 Google Cloud Storage。请使用通过此流程创建的 HMAC 密钥,填写 .aws/credentials 中的 aws_access_key_id 和 aws_secret_access_key 字段。
s5cmd 在 S3、S3 传输加速和 GCS 中会使用虚拟主机样式的存储桶解析方式。如果提供了自定义端点,则会回退到
路径样式。
重试逻辑
s5cmd 对瞬时错误或可能由服务端限流导致的错误使用指数退避重试机制。对于不可重试的错误,例如 invalid credentials、authorization errors 等,则不会重试。默认情况下,
s5cmd 最多重试 10 次,最长持续一分钟。可通过 --retry-count 标志调整重试
次数。
ℹ️ 启用调试级别日志记录以显示可重试的错误。
完整性验证
s5cmd 通过检查 Content-MD5 和 X-Amz-Content-Sha256 标头,验证上传到 Amazon S3 的文件的完整性。AWS SDK 会为标准上传和分段上传添加这些标头。
Content-MD5是文件内容的校验和,使用MD5算法计算。X-Amz-Content-Sha256是文件内容的校验和,使用SHA256算法计算。
如果这些标头中的校验和与实际上传文件的校验和不匹配,s5cmd 将会上传失败。这有助于确保文件在传输过程中未损坏。
如果 S3 计算出的校验和与 Content-MD5 和 X-Amz-Content-Sha256 标头中提供的校验和不匹配,S3 将不会存储该对象,而是向 s5cmd 返回错误消息:MD5 不匹配时错误代码为 InvalidDigest,SHA256 不匹配时错误代码为 XAmzContentSHA256Mismatch。
| 错误代码 | 描述 |
|---|---|
InvalidDigest | Content-MD5 标头中提供的校验和与 S3 计算出的校验和不匹配。 |
XAmzContentSHA256Mismatch | X-Amz-Content-Sha256 标头中提供的校验和与 S3 计算出的校验和不匹配。 |
如果 s5cmd 收到这两个错误代码中的任意一个,就不会重试上传该对象,退出代码为 1。
如果 MD5 校验和不匹配,你会看到类似以下的错误。
ERROR "cp file.log s3://bucket/file.log": InvalidDigest: The Content-MD5 you specified was invalid. status code: 400, request id: S3TR4P2E0A2K3JMH7, host id: XTeMYKd2KECOHWk5S
如果 SHA256 校验和不匹配,你会看到类似以下的错误。
ERROR "cp file.log s3://bucket/file.log": XAmzContentSHA256Mismatch: The provided 'x-amz-content-sha256' header does not match what was computed. status code: 400, request id: S3TR4P2E0A2K3JMH7, host id: XTeMYKd2KECOHWk5S
aws-cli 和 s5cmd 都是可用于与 Amazon S3 交互的命令行工具。不过,两者在验证上传到 S3 的数据完整性方面有一些差异。
- 重试次数:
aws-cli最多会重试上传文件五次,而s5cmd不会重试。 - **校验和:**如果在
~/.aws/config文件中启用了Signature Version 4,aws-cli只会检查文件的SHA256校验和,而s5cmd会同时检查MD5和SHA256校验和。
来源:
使用通配符
在 zsh 等某些 shell 中,* 字符会被视为文件匹配通配符,从而导致 s5cmd 出现意外结果。你可能会看到类似以下的输出:
zsh: no matches found
如果出现这种情况,需要用单引号括起通配符表达式,例如:
s5cmd cp '*.gz' s3://bucket/
输出
s5cmd 支持结构化和非结构化输出。
- 非结构化输出
$ s5cmd cp s3://bucket/testfile .
cp s3://bucket/testfile testfile
$ s5cmd cp --no-clobber s3://somebucket/file.txt file.txt
ERROR "cp s3://somebucket/file.txt file.txt": object already exists
- 如果提供了
--json标志:
{
"operation": "cp",
"success": true,
"source": "s3://bucket/testfile",
"destination": "testfile",
"object": "[object]"
}
{
"operation": "cp",
"job": "cp s3://somebucket/file.txt file.txt",
"error": "'cp s3://somebucket/file.txt file.txt': object already exists"
}
配置并发
numworkers
numworkers 是一个全局选项,用于设置全局工作池的大小。numworkers 的默认值为 256。
cp、select 和 run 等可从并行处理中受益的命令会使用此工作池来执行任务。任务可以是上传、下载,也可以是 run 文件中的任意操作。
例如,如果你要将 100 个文件上传到 S3 存储桶,并将 --numworkers 设为 10,那么 s5cmd 会将同时上传的文件数限制为 10。
s5cmd --numworkers 10 cp '/Users/foo/bar/*' s3://mybucket/foo/bar/
并发数
concurrency 是 cp 命令的一个选项,用于设置单个文件并行上传或下载的分块数量。
此参数由 AWS Go SDK 使用。concurrency 的默认值为 5。
numworkers 和 concurrency 选项可以同时使用:
s5cmd --numworkers 10 cp --concurrency 10 '/Users/foo/bar/*' s3://mybucket/foo/bar/
如果要下载的文件数量较少,但文件很大,将 --numworkers 设置为很高的值并不会影响下载速度。在这种情况下,将 --concurrency 设置为较高的值可能更有助于提升下载速度。
基准测试
下面介绍了有关 s5cmd 性能的一些基准测试。更多详情请参阅这篇文章,它是以下基准测试的来源。
上传/下载单个大文件
上传大量小文件
不同硬件上的性能比较
那么,这一切速度从何而来?
主要有两个原因:
- 它使用 Go 编写。Go 是一种静态编译语言,旨在简化并发系统的开发,并充分利用多核处理器。
- 并行化。
s5cmd通过并发工作池启动任务,并尽可能并行处理工作负载,以实现最大吞吐量。
性能回归测试
bench.py 脚本可用于比较两个不同 s5cmd 构建版本的性能。更多详情请参阅此 README 文件。
高级用法
下面介绍的一些高级用法模式受以下文章启发(感谢!@joshuarobinson)
将 s5cmd 操作与 Unix 命令集成
假设我们在 S3 上有一组对象,并希望按对象名称排序列出它们。
$ s5cmd ls s3://bucket/reports/ | sort -k 4
2020/08/17 09:34:33 1364 antalya.csv
2020/08/17 09:34:33 0 batman.csv
2020/08/17 09:34:33 23114 istanbul.csv
2020/08/17 09:34:33 26154 izmir.csv
2020/08/17 09:34:33 112 samsun.csv
2020/08/17 09:34:33 12552 van.csv
举个更实际的例子,假设我们有一个牛油果价格数据集,希望只获取必要的字节,预览其中几行数据。
$ s5cmd cat s3://bucket/avocado.csv.gz | gunzip | xsv slice --len 5 | xsv table
Date AveragePrice Total Volume 4046 4225 4770 Total Bags Small Bags Large Bags XLarge Bags type year region
0 2015-12-27 1.33 64236.62 1036.74 54454.85 48.16 8696.87 8603.62 93.25 0.0 conventional 2015 Albany
1 2015-12-20 1.35 54876.98 674.28 44638.81 58.33 9505.56 9408.07 97.49 0.0 conventional 2015 Albany
2 2015-12-13 0.93 118220.22 794.7 109149.67 130.5 8145.35 8042.21 103.14 0.0 conventional 2015 Albany
3 2015-12-06 1.08 78992.15 1132.0 71976.41 72.58 5811.16 5677.4 133.76 0.0 conventional 2015 Albany
4 2015-11-29 1.28 51039.6 941.48 43838.39 75.78 6183.95 5986.26 197.69 0.0 conventional 2015 Albany
Beast Mode s5cmd
s5cmd 允许将包含待执行操作列表的文件作为参数传入 run 命令,如上文示例所示。也可以将命令通过管道传入 run:
BUCKET=s5cmd-test; s5cmd ls "s3://$BUCKET/*test" | grep -v DIR | awk ‘{print $NF}’
| xargs -I {} echo “cp s3://$BUCKET/{} /local/directory/” | s5cmd run
上述命令会调用两次 s5cmd:首先搜索后缀为 test 的文件,然后为每个匹配的文件创建一个复制到本地目录命令,最后将这些命令通过管道传入 run。
再来看另一个用法示例:将超过 30 天的文件迁移到云对象存储:
find /mnt/joshua/nachos/ -type f -mtime +30 | awk '{print "mv "$1" s3://joshuarobinson/backup/"$1}'
| s5cmd run
值得一提的是,不应将 run 命令视为适用于所有操作的万能方案。例如,假设我们要删除以下对象:
s3://bucket/prefix/2020/03/object1.gz
s3://bucket/prefix/2020/04/object1.gz
...
s3://bucket/prefix/2020/09/object77.gz
与其通过 run 命令执行
rm s3://bucket/prefix/2020/03/object1.gz
rm s3://bucket/prefix/2020/04/object1.gz
...
rm s3://bucket/prefix/2020/09/object77.gz
不如直接使用
rm 's3://bucket/prefix/2020/0*/object*.gz'
后一种方式每千个对象只发送一个删除请求,而前一种方式会为传入 run 的每个子命令单独发送删除请求。因此,这两种方式的运行时间可能存在显著差异。
免责声明
s5cmd 无意与 aws-cli 兼容,也不保证兼容。命令或标志的任何相似之处都纯属巧合,不应被解读为有意兼容。
许可证
MIT。请参阅 LICENSE。