2 версии

0.1.1 9 мая 2020 года
0.1.0 3 мая 2020 года

#13 в #acl

MIT/Apache

37KB
592 строки

с3rename

с3rename — это инструмент для массового renaming ключей в контейнере S3.

Интерфейс спроектирован для имитации утилиты Perl rename в GNU/Linux (известен также как prename и perl-rename).

с3rename использует асинхронные запросы для renaming ключей параллельно, как можно быстрее.

Выражение, предоставленное, применяется ко всему ключу, что позволяет rename "директории" родителя.

Свойства объекта сохраняются, если не используется флаг --no-preserve-properties.

Настройки ACL (Список доступа) объекта также будут сохраняться, если не используется флаг --no-preserve-acl.

Рекомендуется использовать флаг --dry-run вначале, чтобы убедиться, что изменения соответствуют вашему намерению.

Использование

Обратите внимание, что независимо от префикса, используемого для фильтрации в предоставленном URL S3, регулярное выражение применяется ко всему ключу. Это необходимо для возможности полного изменения структуры директории.

USAGE:
    s3rename [FLAGS] [OPTIONS] <expr> <s3-url>

FLAGS:
    -n, --dry-run                   Do not carry out modifications (only print)
    -h, --help                      Prints help information
        --no-anonymous-groups       Do not allow anonymous capture groups i.e. \1, \2 - may be useful when dealing with
                                    keys containing backslashes
        --no-preserve-acl           Do not preserve Object ACL settings (all will be set to private)
        --no-preserve-properties    Do not preserve object properties (saves retrieving per-object details) - using this
                                    flag will remove any encryption
    -q, --quiet                     Do not print key modifications
    -V, --version                   Prints version information
    -v, --verbose                   Print debug messages

OPTIONS:
        --aws-region <aws-region>    AWS Region (will be taken from bucket region if not overridden here)
        --canned-acl <canned-acl>    Canned access_control_list override - sets this ACL for all renamed keys [possible
                                     values: private, public-read, public-read-write, aws-exec-read, authenticated-read,
                                     bucket-owner-read, bucket-owner-full-control]

ARGS:
    <expr>      Perl RegEx Replace Expression (only s/target/replacement/flags form supported)
    <s3-url>    S3 URL: s3://bucket-name/optional-key-prefix

Примеры

с3rename использует формат регулярного выражения Perl (например, sed) для renaming файлов

$ aws s3 ls s3://s3rename-test-bucket --recursive
2020-05-01 12:30:25         16 testnewfile.txt

$ ./s3rename "s/new/old" s3://s3rename-test-bucket/test
Renaming testnewfile.txt to testoldfile.txt

$ aws s3 ls s3://s3rename-test-bucket --recursive
2020-05-01 12:33:48         16 testoldfile.txt

Флаг --dry-run будет выводить изменения, которые необходимо сделать, но не будет их выполнять. Это очень рекомендуется перед выполнением изменений.

По умолчанию настройки ACL объектов будут сохраняться (если не передан --no-preserve-acl), но это не применяется к настройкам ACL, которые зависят от настроек контейнера (например, доступ для публичной записи).

Опция --canned-acl <canned-acl> может быть использована для установки ACL всех renamed объектов до предоставленного canned ACL. Обратите внимание, что некоторые canned ACLs зависят от настроек контейнера (например, public-read-write).

Renaming плоских файлов в структуру вложенных директорий для AWS Glue

此程序最初是为了解决需要重命名存储在扁平结构中的数千个文件的键,以便它们可以被AWS Glue正确解析而受到启发,AWS Glue需要一个具有“目录”名称与分区对应的嵌套结构。

$ aws s3 ls s3://s3rename-test-bucket/datatest --recursive
2020-05-01 12:38:33          0 datatest/
2020-05-01 12:38:43          0 datatest/data_2020-04-01.txt
2020-05-01 12:38:43          0 datatest/data_2020-04-02.txt
2020-05-01 12:38:43          0 datatest/data_2020-04-03.txt
2020-05-01 12:38:43          0 datatest/data_2020-04-04.txt
2020-05-01 12:38:43          0 datatest/data_2020-04-05.txt
2020-05-01 12:38:43          0 datatest/data_2020-05-01.txt
2020-05-01 12:38:43          0 datatest/data_2020-05-02.txt
2020-05-01 12:38:43          0 datatest/data_2020-06-01.txt

$ ./s3rename 's/data_(?P<year>[0-9]{4})-(?P<month>[0-9]{2})-(?P<day>[0-9]{2}).txt/year=$year\/month=$month\/day=$day\/data_$year-$month-$day.txt/g' s3://s3rename-test-bucket/datatest
Renaming datatest/ to datatest/
Renaming datatest/data_2020-04-01.txt to datatest/year=2020/month=04/day=01/data_2020-04-01.txt
Renaming datatest/data_2020-04-02.txt to datatest/year=2020/month=04/day=02/data_2020-04-02.txt
Renaming datatest/data_2020-04-03.txt to datatest/year=2020/month=04/day=03/data_2020-04-03.txt
Renaming datatest/data_2020-04-04.txt to datatest/year=2020/month=04/day=04/data_2020-04-04.txt
Renaming datatest/data_2020-04-05.txt to datatest/year=2020/month=04/day=05/data_2020-04-05.txt
Renaming datatest/data_2020-05-01.txt to datatest/year=2020/month=05/day=01/data_2020-05-01.txt
Renaming datatest/data_2020-05-02.txt to datatest/year=2020/month=05/day=02/data_2020-05-02.txt
Renaming datatest/data_2020-06-01.txt to datatest/year=2020/month=06/day=01/data_2020-06-01.txt

$ aws s3 ls s3://s3rename-test-bucket/datatest --recursive
2020-05-01 12:38:33          0 datatest/
2020-05-01 12:39:38          0 datatest/year=2020/month=04/day=01/data_2020-04-01.txt
2020-05-01 12:39:38          0 datatest/year=2020/month=04/day=02/data_2020-04-02.txt
2020-05-01 12:39:38          0 datatest/year=2020/month=04/day=03/data_2020-04-03.txt
2020-05-01 12:39:38          0 datatest/year=2020/month=04/day=04/data_2020-04-04.txt
2020-05-01 12:39:38          0 datatest/year=2020/month=04/day=05/data_2020-04-05.txt
2020-05-01 12:39:38          0 datatest/year=2020/month=05/day=01/data_2020-05-01.txt
2020-05-01 12:39:38          0 datatest/year=2020/month=05/day=02/data_2020-05-02.txt
2020-05-01 12:39:38          0 datatest/year=2020/month=06/day=01/data_2020-06-01.txt

请注意,sed正则表达式字符串使用了单引号,以避免shell中的$符号引起的问题。

您还可以使用匿名捕获组,替换部分可以通过$或逗号标记,即:

's/data_([0-9]{4})-([0-9]{2})-([0-9]{2}).txt/year=\1\/month=\2\/day=\3\/data_\1-\2-\3.txt/g'

与上述内容等价,并且与以下内容等价

's/data_([0-9]{4})-([0-9]{2})-([0-9]{2}).txt/year=$1\/month=$2\/day=$3\/data_$1-$2-$3.txt/g'

使用多个美元符号来转义美元符号(对于字面美元符号)。

安装

s3rename在运行时依赖于OpenSSL。

从源码构建需要Rust工具链和Cargo。

如果您使用此工具,请考虑在Github仓库上给它加星,并在AUR上对该包进行投票。

Arch Linux(通过Arch用户仓库(AUR)

使用yay AUR助手

$ yay -S s3rename

或者,您还可以从AUR手动安装包

Cargo(通过crates.io

$ cargo install s3rename

然后,s3rename二进制文件将位于您的Cargo二进制文件目录中(这应该已经添加到您的$PATH中)。

Cargo(从此仓库)

您可以通过Cargo从此克隆的仓库安装s3rename

$ git clone [email protected]:jamesmcm/s3rename.git
$ cd s3rename
$ cargo install --path .

然后,s3rename二进制文件将位于您的Cargo二进制文件目录中(这应该已经添加到您的$PATH中)。

Linux x86_64二进制文件

为Linux x86_64编译的静态二进制文件可在Github发布版中找到。

已知问题

  • 目前不支持使用S3对象锁定的存储桶和对象。
  • 设置在存储桶属性中的带有前缀的过期规则将不会被更新(因此,任何被这些规则排除在外的键将不再应用过期规则)。未来可能会添加一个用于更新过期规则的特殊命令。
  • s3rename不支持加密存储桶的自定义加密密钥(即,如果您的加密密钥不是由AWS生成和存储的)。这可能在未来的版本中添加。
  • 重命名操作不是完全原子的(因为它涉及单独的CopyObject和DeleteObject请求)- 这意味着如果s3rename在操作过程中被突然终止,存储桶可能会留下已复制但未重命名的原始文件(使用相同参数重新运行s3rename将解决这个问题)。

S3计费

s3rename在同一个存储桶内操作键,因此不应触发数据传输费用

虽然它确实使用CopyObjectRequests来执行重命名,但额外数据不会长时间存在,因此不应触发数据使用费用。

有关数据存储的计费,S3计费文档指出:

一个月内计费存储量是基于整个月平均使用的存储量。这包括您在AWS账户下创建的所有存储桶中存储的所有对象数据和元数据。我们使用“TimedStorage-ByteHrs”来衡量您的存储使用量,这些将在月底汇总以生成您的月度费用。

许可

s3rename采用以下任一许可:

由您选择。

贡献

除非您明确说明,否则根据Apache-2.0许可证定义的,您有意提交供作品包含的贡献,将按照上述方式双授权,不附加任何额外条款或条件。

依赖项

约20MB
约335K SLoC