AWS S3 cli - 标记目录中的所有对象

时间:2017-08-14 14:29:43

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

有没有办法使用一个put-object-tagging cli命令将标记(或标记集)应用于S3目录中的所有对象?

即如果我有两个文件(test0.txttest.txt)我可以运行以下两个命令:

>aws s3api put-object-tagging --bucket mybucket --key foo/bar/test0.txt --tagging 'TagSet=[{Key=colour,Value=blue}]'
>aws s3api put-object-tagging --bucket mybucket --key foo/bar/test1.txt --tagging 'TagSet=[{Key=colour,Value=blue}]'

当尝试将文件夹本身作为--key选项传递时,我收到以下错误(因为它必须引用单个对象):

>aws s3api put-object-tagging --bucket mybucket --key foo/bar/ --tagging 'TagSet=[{Key=colour,Value=blue}]
An error occurred (NoSuchKey) when calling the PutObjectTagging operation: The specified key does not exist.

有解决方法吗?

3 个答案:

答案 0 :(得分:7)

S3中没有目录的概念。这是实现您想要的粗糙方式。其他海报可能有更好的解决方案。以下解决方案首先获取文件夹中的所有对象,然后为每个对象调用put-object-tagging注意:我没有测试此解决方案。

aws s3api list-objects --bucket mybucket --query 'Contents[].{Key:Key}' 
    --output text | grep foo/bar/ | xargs aws s3api put-object-tagging 
    --bucket mybucket --tagging 'TagSet=[{Key=colour,Value=blue}]' --key

答案 1 :(得分:4)

helloV 的答案已得到纠正(已经测试过),但是如果存储桶很大,这不是一个好的解决方案,aws将需要时间来扫描整个存储桶。这是我的解决方法

aws s3api list-objects --bucket mybucket --query 'Contents[].{Key:Key}' --prefix foo/bar --output text | xargs -n 1 aws s3api put-object-tagging  --bucket mybucket --tagging 'TagSet=[{Key=colour,Value=blue}]' --key

该命令分为两部分:

  1. 列出存储桶前缀中的所有对象并输出为文本
  2. 使用xargs -n 1循环每个结果并标记它。

答案 2 :(得分:3)

Calvin Duy Canh Tran 的答案可能会返回文件名带有空格的错误,在下面的命令中,我为xargs添加了-I标志以将参数“ targetobject”替换为标准输入。

aws s3api list-objects --bucket mybucket --query 'Contents[].{Key:Key}' --prefix testfolder/  --output text | xargs -n 1 -I targetobject aws s3api put-object-tagging --bucket mybucket --tagging 'TagSet=[{Key=colour,Value=blue}]' --key targetobject