Cas*_*per 3 amazon-s3 amazon-web-services aws-cli
我的目标是使用aws cli s3api
. 为了做到这一点,我需要首先获得所有这些文件的列表,然后发出一个restore
命令,最后发出一个copy
将它们全部更改为 STANDARD的命令。
问题是,文件数量太大(~500 万),core dump segmentation fault
如果最大项目超过 600k 到 700k ,最终会导致错误。如果我不提供--max-item
参数,我会得到同样的错误。所以我无法获得低于 700k 阈值的文件。这是我使用的命令:
aws s3api list-objects --bucket my-bucket --query 'Contents[?StorageClass==`GLACIER`]' --max-item 700000 > glacier.txt
Run Code Online (Sandbox Code Playgroud)
有什么解决方法吗?
所以我--starting-token
从list-objects
命令中发现了这个选项。所以我写了一个脚本来扫描 10 万个对象的所有项目。该脚本将输出一个包含所有 GLACIER 对象的 S3 密钥的文件。
#!/bin/bash
BUCKET="s3-bucket-name"
PREFIX="foldername"
PROFILE="awscliprofile"
MAX_ITEM=100000
var=0
NEXT_TOKEN=0
while true; do
var=$((var+1))
echo "Iteration #$var - Next token: $NEXT_TOKEN"
aws s3api list-objects \
--bucket $BUCKET \
--prefix $PREFIX \
--profile $PROFILE \
--max-item $MAX_ITEM \
--starting-token $NEXT_TOKEN > temp
awk '/GLACIER/{getline; print}' temp >> glacier.txt
NEXT_TOKEN=$(cat temp | grep NextToken | awk '{print $2}' | sed 's/\("\|",\)//g')
if [ ${#NEXT_TOKEN} -le 5 ]; then
echo "No more files..."
echo "Next token: $NEXT_TOKEN"
break
rm temp
fi
rm temp
done
echo "Exiting."
Run Code Online (Sandbox Code Playgroud)
之后,我可以使用restore-object
并最终copy-object
将所有这些文件的存储类别更改为标准。在此处查看更多脚本。希望这可以帮助任何需要实现相同目标的人。
归档时间: |
|
查看次数: |
3309 次 |
最近记录: |