AWS S3 CLI CP文件并添加元数据

时间:2016-11-16 08:12:14

标签: amazon-web-services amazon-s3 aws-cli

尝试将名为test.txt的本地文件复制到我的s3存储桶并将元数据添加到文件中。

但它总是打印错误:

参数--metadata-directive:选项无效,有效选项为:COPY | REPLACE

是否可以使用cp命令执行此操作,因为我理解应该可以使用的文档。 AWS CLI CP DOCS

这是我尝试过的命令:

aws s3 cp test.txt to s3://a-bucket/test.txt --metadata x-amz-meta-cms-id:34533452

aws s3 cp test.txt to s3://a-bucket/test.txt --metadata-directive COPY --metadata x-amz-meta-cms-id:34533452

aws s3 cp test.txt to s3://a-bucket/test.txt --metadata-directive COPY --metadata '{"x-amz-meta-cms-id":"34533452"}'

aws s3 cp test.txt to s3://a-bucket/test.txt --metadata '{"x-amz-meta-cms-id":"34533452"}'

aws --version: aws-cli / 1.9.7 Python / 2.7.10 Darwin / 16.1.0 botocore / 1.3.7

操作系统: macOS Sierra版本10.12.1

修改

值得一提的是,上传没有--metadata标志的文件可以正常工作。

嗯,我已经用aws s3 cp help检查了我的cli版本的帮助 事实证明它没有列出--metadata作为选项,因为上面给定链接的文档确实如此。

如果runnig旧版本的aws cli

Use aws s3api put-object

如何将文件上传到存储桶并添加元数据:

aws s3api put-object --bucket a-bucket --key test.txt --body test.txt --metadata '{"x-amz-meta-cms-id":"34533452"}'

文档:AWS S3API DOCS

3 个答案:

答案 0 :(得分:12)

1.9.10

以来,已添加对元数据选项的支持
  

aws s3在cp,mv和sync中添加了对自定义元数据的支持。

所以将你的aws cli升级到这个版本(甚至更新到最新版本) - 并且metadata值需要是一个地图所以

aws s3 cp test.txt s3://a-bucket/test.txt --metadata '{"x-amz-meta-cms-id":"34533452"}'

答案 1 :(得分:1)

安装s3cmd工具(免费)并调用 s3cmd modify --add-header x-amz-meta-foo:bar s3:/// modify:' s3:///'

foo - 键 bar - value

答案 2 :(得分:-1)

元数据指令“COPY”选项存在错误。

aws s3api copy-object --bucket testkartik --copy-source testkartik/costs.csv --key costs.csv --metadata-directive "COPY" --metadata "SomeKey=SomeValue"

enter image description here

以下是使用JQ解决方法了解cli命令的三个步骤。

  1. 使用命令行安装JQ library以处理json元数据。
  2. 阅读现有元数据。

    aws s3api head-object --bucket <bucket> --key <key> | jq '.Metadata' | jq --compact-output '. +{"new":"metadata", "another" : "metadata"}'

  3. 添加新元数据。

    aws s3api copy-object --bucket <bucket-name> --copy-source <bucket/key> --key <key> --metadata-directive "REPLACE" --metadata $(READ-THE-EXISTING-From-Step-2)

    一次完成命令。

    aws s3api copy-object --bucket <bucket-name> --copy-source <bucket/key> --key <key> --metadata-directive "REPLACE" --metadata $(aws s3api head-object --bucket <bucket> --key <key> | jq '.Metadata' | jq --compact-output '. +{"new":"metadata", "another" : "metadata"}')