AWS S3 - 如何获取 GLACIER 存储的所有文件 class
AWS S3 - How to get all files that are GLACIER storage class
我的目标是使用 aws cli s3api
将当前作为 GLACIER 存储 class 的所有文件转换为 STANDARD。为此,我需要先获取所有这些文件的列表,然后触发 restore
命令,最后触发 copy
命令将它们全部更改为标准。
问题是,文件数量太大(约 500 万),如果最大项目超过 600k 到 700k,最终会导致 core dump segmentation fault
错误。如果我不提供 --max-item
参数,我会得到同样的错误。所以我再也无法获得低于 700k 阈值的文件。这是我使用的命令:
aws s3api list-objects --bucket my-bucket --query 'Contents[?StorageClass==`GLACIER`]' --max-item 700000 > glacier.txt
有什么解决办法吗?
所以我从 list-objects
命令中发现了选项 --starting-token
。所以我写了一个脚本来扫描一批 100k 个对象中的所有项目。此脚本将输出一个包含所有 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 }' | 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."
之后我可以使用 restore-object
最后 copy-object
将所有这些文件的存储 class 更改为标准。查看更多脚本 here。希望这可以帮助任何需要实现同样目标的人。
这是一种衬里解决方案
aws s3api list-objects --bucket *bucket-name*| grep "StorageClass" > nonglacier.txt
然后您可以使用
grep 存储 class
cat nonglacier.txt | grep GLACIER | wc -l
也可以概括为
aws s3api list-objects --bucket <bucket-name>| grep "StorageClass" | grep GLACIER | wc -l
我的目标是使用 aws cli s3api
将当前作为 GLACIER 存储 class 的所有文件转换为 STANDARD。为此,我需要先获取所有这些文件的列表,然后触发 restore
命令,最后触发 copy
命令将它们全部更改为标准。
问题是,文件数量太大(约 500 万),如果最大项目超过 600k 到 700k,最终会导致 core dump segmentation fault
错误。如果我不提供 --max-item
参数,我会得到同样的错误。所以我再也无法获得低于 700k 阈值的文件。这是我使用的命令:
aws s3api list-objects --bucket my-bucket --query 'Contents[?StorageClass==`GLACIER`]' --max-item 700000 > glacier.txt
有什么解决办法吗?
所以我从 list-objects
命令中发现了选项 --starting-token
。所以我写了一个脚本来扫描一批 100k 个对象中的所有项目。此脚本将输出一个包含所有 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 }' | 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."
之后我可以使用 restore-object
最后 copy-object
将所有这些文件的存储 class 更改为标准。查看更多脚本 here。希望这可以帮助任何需要实现同样目标的人。
这是一种衬里解决方案
aws s3api list-objects --bucket *bucket-name*| grep "StorageClass" > nonglacier.txt
然后您可以使用
grep 存储 classcat nonglacier.txt | grep GLACIER | wc -l
也可以概括为
aws s3api list-objects --bucket <bucket-name>| grep "StorageClass" | grep GLACIER | wc -l