mcpField
S
s5cmd

s5cmd

官方Agent-ready
github.com云与 DevOps4.2ks5cmd72 周前更新
代码仓库访问官网

关于 s5cmd

s5cmd 是一个高性能的命令行工具,用于与 Amazon S3 交互。支持批量操作、并行传输和脚本化工作流,比原生 AWS 工具更快。

主要功能

  1. 01并行上传和下载 S3 文件,大幅加快传输速度
  2. 02列出、复制、删除和同步 S3 存储桶中的对象
  3. 03支持通配符和批量操作处理多个文件
  4. 04与本地文件系统和远程 S3 之间传输数据

适用场景

  1. 01自动化 CI/CD 流程中的工件存储和检索
  2. 02大规模批量管理云存储中的数据
  3. 03编码 Agent 快速访问和操作 S3 资源

安装

选择你的系统或包管理器,复制命令到终端运行。

$
brew install peak/tap/s5cmd

安装完成后运行s5cmd --version确认安装成功。

命令示例

常用命令按使用顺序排列。

01
s5cmd ls s3://bucket/
02
s5cmd cp file.txt s3://bucket/

详细介绍

Go 报告 Github Actions 状态

README 配图

概述

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 的性能及其速度如此之快的原因,请参阅 基准测试部分

功能

README 配图

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-forge channel 安装 s5cmd:

conda config --add channels conda-forge
conda config --set channel_priority strict

启用 conda-forge channel 后,可使用 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 按以下优先级顺序检测区域:

  1. cp 命令的 --source-region 或 --destination-region 标志。
  2. AWS_REGION 环境变量。
  3. AWS 配置文件的区域部分。
  4. 根据存储桶区域自动检测(通过 HeadBucket API 调用)。
  5. 默认区域 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 > dstsrc != dst✅
src > dstsrc == dst✅
src <= dstsrc != dst✅
src <= dstsrc == dst❌
仅比较大小

使用 --size-only 标志,可以采用仅比较文件大小的策略。源被视为事实来源,任何大小差异都会导致 s5cmd 将源对象复制到目标位置。

修改时间大小是否应同步
src > dstsrc != dst✅
src > dstsrc = dst❌
src <= dstsrc != dst✅
src <= dstsrc == 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。

错误代码描述
InvalidDigestContent-MD5 标头中提供的校验和与 S3 计算出的校验和不匹配。
XAmzContentSHA256MismatchX-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 性能的一些基准测试。更多详情请参阅这篇文章,它是以下基准测试的来源。

上传/下载单个大文件

获取/上传性能图表

上传大量小文件

多对象上传性能图表

不同硬件上的性能比较

S3 上传速度图表

那么,这一切速度从何而来?

主要有两个原因:

  • 它使用 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。

评论

支持 Markdown