AWS S3 CLI CP 文件并添加元数据
AWS S3 CLI CP file and add metadata
正在尝试将名为 test.txt 的本地文件复制到我的 s3 存储桶并向该文件添加元数据。
但它总是打印错误:
argument --metadata-directive:无效选择,有效选择是:COPY |替换
是否可以使用 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
OS: macOS Sierra 版本 10.12.1
编辑
值得一提的是,上传没有 --metadata 标志的文件也能正常工作。
嗯,我已经使用 aws s3 cp help
查看了我的 cli 版本的帮助
事实证明它没有将 --metadata
列为选项,正如上面给定 link 的文档那样。
如果运行旧版本的 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"}'
事实上,自 1.9.10
以来,已经添加了对元数据选项的支持
aws s3
Added support for custom metadata in cp, mv, and sync.
所以将你的 aws cli 升级到这个版本(或者更好到最新版本)- metadata
值需要是一个映射所以
aws s3 cp test.txt s3://a-bucket/test.txt --metadata '{"x-amz-meta-cms-id":"34533452"}'
元数据指令 "COPY" 选项存在错误。
aws s3api copy-object --bucket testkartik --copy-source testkartik/costs.csv --key costs.csv --metadata-directive "COPY" --metadata "SomeKey=SomeValue"
以下是使用 JQ 解决方法了解 cli 命令的三个步骤。
- 安装 JQ library 以使用命令行处理 json 元数据。
读取现有元数据。
aws s3api head-object --bucket <bucket> --key <key> | jq '.Metadata' | jq --compact-output '. +{"new":"metadata", "another" : "metadata"}'
添加新元数据。
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"}')
安装 s3cmd
工具(免费)并像这样调用:
s3cmd modify --add-header x-amz-meta-foo:bar s3://<bucket>/<object>
With x-amz-meta-foo:bar
header you will get foo
as key and bar
as value of that key.
正在尝试将名为 test.txt 的本地文件复制到我的 s3 存储桶并向该文件添加元数据。
但它总是打印错误:
argument --metadata-directive:无效选择,有效选择是:COPY |替换
是否可以使用 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
OS: macOS Sierra 版本 10.12.1
编辑
值得一提的是,上传没有 --metadata 标志的文件也能正常工作。
嗯,我已经使用 aws s3 cp help
查看了我的 cli 版本的帮助
事实证明它没有将 --metadata
列为选项,正如上面给定 link 的文档那样。
如果运行旧版本的 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"}'
事实上,自 1.9.10
以来,已经添加了对元数据选项的支持
aws s3
Added support for custom metadata in cp, mv, and sync.
所以将你的 aws cli 升级到这个版本(或者更好到最新版本)- metadata
值需要是一个映射所以
aws s3 cp test.txt s3://a-bucket/test.txt --metadata '{"x-amz-meta-cms-id":"34533452"}'
元数据指令 "COPY" 选项存在错误。
aws s3api copy-object --bucket testkartik --copy-source testkartik/costs.csv --key costs.csv --metadata-directive "COPY" --metadata "SomeKey=SomeValue"
以下是使用 JQ 解决方法了解 cli 命令的三个步骤。
- 安装 JQ library 以使用命令行处理 json 元数据。
读取现有元数据。
aws s3api head-object --bucket <bucket> --key <key> | jq '.Metadata' | jq --compact-output '. +{"new":"metadata", "another" : "metadata"}'
添加新元数据。
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"}')
安装 s3cmd
工具(免费)并像这样调用:
s3cmd modify --add-header x-amz-meta-foo:bar s3://<bucket>/<object>
With
x-amz-meta-foo:bar
header you will getfoo
as key andbar
as value of that key.