2 个稳定版本
1.1.0 | 2020年3月13日 |
---|---|
1.0.0 | 2019年11月8日 |
#937 in 文件系统
51KB
891 代码行
s3-utils
基于 Amazon S3 的工具和工具集,在命令行界面中提供便利的 API。
此工具包含了一组用于处理 Amazon S3 的命令行工具,专注于包含 S3 API 中难以直接访问的功能。它是在工作过程中从各种脚本和用例中演变而来的,但被包装成更有用的东西。随着时间的推移,可能会添加更多工具,因为它们变得有用或成为必需。
所有 S3 交互都由 rusoto_s3 控制。
安装
您可以从该仓库或 Crates(一旦发布)安装 s3-utils
。
# install from Cargo
$ cargo install s3-utils
# install the latest from GitHub
$ cargo install --git https://github.com/whitfin/s3-utils.git
命令
可以通过遵循 AWS 文档 中的说明来配置凭证。您可能使用的几乎所有命令都将采用这种形状
$ AWS_ACCESS_KEY_ID=MY_ACCESS_KEY_ID \
AWS_SECRET_ACCESS_KEY=MY_SECRET_ACCESS_KEY \
AWS_DEFAULT_REGION=MY_AWS_REGION \
s3-utils <subcommand> <arguments>
几乎所有命令都有几个可用的选项(例如,使用 -d
进行 dry 运行操作),但在假设它存在之前,请务必检查命令文档。每个命令都公开了一个 -h
选项来显示帮助菜单,这是标准的。以下示例将省略 AWS_
环境变量以简化内容。
concat
此命令专注于在 S3 中文件的连接。您可以通过提供源模式和一个目标文件路径以基本方式连接文件
$ s3-utils concat my.bucket.name 'archives/*.gz' 'archive.gz'
如果您处理的是长路径,则可以在存储桶名称上添加前缀,以避免多次输入整个路径。在以下情况下,*.gz
和 archive.gz
相对于 my/annoyingly/nested/path/
前缀。
$ s3-utils concat my.bucket.name/my/annoyingly/nested/path/ '*.gz' 'archive.gz'
您还可以使用模式匹配(由官方 regex
crate 驱动),在目标路径中使用源路径的片段。以下是将日期层次结构(YYYY/MM/DD
)映射到平面结构(YYYY-MM-DD
)的示例。
$ s3-utils concat my.bucket.name 'date-hierachy/(\d{4})/(\d{2})/(\d{2})/*.gz' 'flat-hierarchy/$1-$2-$3.gz'
在这种情况下,所有位于 2018/01/01/*
的文件将被映射到 2018-01-01.gz
。不要忘记在您的表达式中添加单引号,以避免任何讨厌的 shell 展开!
为了远程连接文件(即不需要将它们拉到您的机器上),此工具使用 S3 的分片上传 API。这意味着此工具继承了该 API 的所有限制。通常这不是问题,但一个更加明显的问题是文件大小小于 5MB 无法连接。为了避免浪费 AWS 调用,这目前被捕获在客户端层,并会导致客户端错误。由于解决此问题的复杂性,目前不支持连接小于 5MB 大小的文件。
rename
rename
命令提供动态的文件重命名功能,无需下载文件。此命令的主要用途是能够使用模式在单个命令中重命名大量文件。
您可以以基本的方式重命名文件,例如仅更改它们的名称前缀。
$ s3-utils rename my.bucket.name 'my-directory/(.*)' 'my-new-directory/$1'
尽管基本,但这展示了您如何在重命名操作中使用捕获的匹配模式。这允许您执行更复杂的映射,例如将现有的树形结构转换为平面文件。
$ s3-utils rename my.bucket.name '(.*)/(.*)/(.*)' '$1-$2-$3'
这是一个非常简单的模型,但提供了一个非常灵活的工具,可以快速更改很多东西。
由于当前 AWS S3 API 的限制,此命令无法处理大于 5GB 的文件。我们可能会在某个时候添加一个解决方案,但现在这可能会引发错误。
report
报告生成关于 S3 存储桶或其子目录的元数据。它们可以用来检查诸如文件大小、修改日期等。此命令非常简单,因为它相当不可定制。
$ s3-utils report my.bucket.name
$ s3-utils report my.bucket.name/my/directory/path
这生成遵循相对简单格式的 shell 输出,旨在易于扩展并且在 shell 管道中方便使用。一般格式相当稳定,但某些格式可能会随时间变化(间距、数字格式等)。
以下是一个基于真实 S3 存储桶的示例(尽管使用的是假名称)。
[general]
total_time=7s
total_space=1.94TB
total_files=51,152
[file_size]
average_file_size=37.95MB
average_file_bytes=37949529
largest_file_size=1.82GB
largest_file_bytes=1818900684
largest_file_name=path/to/my_largest_file.txt.gz
smallest_file_size=54B
smallest_file_bytes=54
smallest_file_name=path/to/my_smallest_file.txt.gz
smallest_file_others=12
[extensions]
unique_extensions=1
most_frequent_extension=gz
[modification]
earliest_file_date=2016-06-11T17:36:57.000Z
earliest_file_name=path/to/my_earliest_file.txt.gz
earliest_file_others=3
latest_file_date=2017-01-01T00:03:19.000Z
latest_file_name=path/to/my_latest_file.txt.gz
此示例报告基于此子命令的初始构建,因此根据您何时访问此工具,可能包含更多(或更少)内容。
依赖项
~21MB
~346K SLoC