我在bash脚本中调用AWS命令。我需要向前缀为以下前缀的文件添加标记:
/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/作为前缀。但是,这会引发一个错误:
调用NoSuchKey操作时发生错误( PutObjectTagging ):指定的键不存在
循环中的bash有什么方法可以遍历到"foo“级别,这样我就可以拥有完整的路径:前缀/base/user3 1/foo//base/user3 2/foo,/ase/user3 3/foo为前缀动态定义?谢谢你的回应。
发布于 2021-09-13 18:23:55
我自己找到了一个像样的解决方案。取代原来员额中的这一行:
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效果很好。
https://stackoverflow.com/questions/69135869
复制相似问题