bash 为 AWS CLI 命令的标记脚本的前缀参数动态构建值的解决方案

bash solution to dynamically build value for prefix parameter of my tagging script for AWS CLI commands

我在 bash 脚本中调用 AWS CLI 命令。我需要给前缀如下的文件添加标签:

/base/user1/foo/file1
/base/user2/foo/fileA
/base/user3/foo/fileX

我只想删除“foo”下的那些,但是如果用户有这样的文件:

/base/user1/bar/fileZ

,我不想删除“栏”下的那些。

我有一个脚本:

!/bin/bash

aws s3api list-objects --bucket myBucket --query 'Contents[].{Key: Key}' --prefix myPrefix --output text  | xargs -n 1 aws s3api put-object-tagging  --bucket myBucket --tagging "{\"TagSet\": [{ \"Key\": \"myKey\", \"Value\": \"myValue\" }]}" --key

只要 myPrefix 是绝对路径就可以正常工作,例如:

/base/user1/foo/

,但我有太多用户无法手动执行此操作,所以我想做类似的事情:

/base/*/foo/

为前缀。但是,这会引发错误:

调用PutObjectTagging操作时发生错误(NoSuchKey):指定的key不存在

在 bash 中有没有办法在循环中或向下遍历到“foo”级别的东西,以便我可以获得完整路径:prefix /base/user1/foo/, /base/user2/foo, /ase/user3/foo动态定义前缀?感谢您的任何回复。

我能够自己找到一个像样的解决方案。从原来的 post:

替换这一行
aws s3api list-objects --bucket myBucket --query 'Contents[].{Key: Key}' --prefix myPrefix --output text  | xargs -n 1 aws s3api put-object-tagging  --bucket myBucket --tagging "{\"TagSet\": [{ \"Key\": \"myKey\", \"Value\": \"myValue\" }]}" --key

,具有以下内容:

for BUCKET_PATH in $(aws s3 ls --recursive --summarize $BUCKET);
do
if [[ $BUCKET_PATH == *$PREFIX* ]]; then
  echo $BUCKET_PATH
  aws s3api put-object-tagging  --bucket ${BUCKET} --key ${BUCKET_PATH} --tagging "{\"TagSet\": [{ \"Key\": \"${KEY}\", \"Value\": \"${VALUE}\" }]}"
fi
done

效果很好。