如何删除 Amazon S3 中超过 7 天的文件?
How to delete files older than 7 days in Amazon S3?
需要删除 Amazon S3 中超过 7 天的文件,需要 shell 脚本来执行此操作,google 搜索不成功,我找到了以下 url
http://shout.setfive.com/2011/12/05/deleting-files-older-than-specified-time-with-s3cmd-and-bash/
这对我们没有帮助,有人有删除超过 7 天的所有文件的脚本吗?
最简单的方法是在 Amazon S3 存储桶上定义 Object Lifecycle Management。
您可以指定超过特定天数的对象应该过期(删除)。最好的部分是,这会定期自动发生,您不需要 运行 自己的脚本。
如果您想自己做,最好是编写一个脚本(例如在 Python 中)来检索文件列表并删除早于特定日期的文件。
作为 shell 脚本来做有点麻烦。
谢谢,约翰
我们稍微修改了代码,现在运行良好。
aws s3 ls BUCKETNAME/ | while read -r line;
do
createDate=`echo $line|awk {'print " "'}`
createDate=`date -d"$createDate" +%s`
olderThan=`date --date "7 days ago" +%s`
if [[ $createDate -lt $olderThan ]]
then
fileName=`echo $line|awk {'print '}`
if [[ $fileName != "" ]]
then
aws s3 rm BUCKETNAME/$fileName
fi
fi
done;
这是我为我的环境编写的一个简单脚本,希望有人会觉得它有用。谢谢
而且,我的 s3 存储桶中的文件是 FULL_BACKUP_2020-06-25.tar.gz
格式。
#!/bin/bash
#Defining variables.
#Date=`date +%Y-%m-%d`
ThreeDaysOldDate=`date -d '-3 days' +%Y-%m-%d | tr -d '-'`
Obj=`/usr/local/bin/aws s3 ls s3://bucket_name/folder/ | sed -n '2,$'p | awk '{print }'| cut -b 13-22 | tr -d '-'`
#Comparing files older than past 3 days and removing them from S3.
for i in $Obj
do
if [ $i -lt $ThreeDaysOldDate ]; then
var1="FULL_BACKUP_"
var2=".tar.gz"
year=$(echo $i | cut -c 1-4)
mon=$(echo $i | cut -c 5-6)
day=$(echo $i | cut -c 7-8)
DATE=$var1$year-$mon-$day$var2
/usr/local/bin/aws s3 rm s3://bucket_name/folder/$DATE > /dev/null 2>&1
fi
done
这将从 S3 存储桶中递归删除 159 天前的文件。您可以根据需要更改日期。其中包括带空格的文件名。以上脚本不适用于带空格的文件名。
注意:现有目录结构可能会被删除。如果你不喜欢目录结构,你可以使用这个。
如果您更喜欢目录结构,请给出最后一个子目录的完整路径,并在每次执行时修改它以保护父目录结构。
示例:
s3://BucketName/dir1/dir2/dir3/
s3://BucketName/dir1/dir2/dir4/
s3://BucketName/dir1/dir2/dir5/
vim s3_file_delete.sh
s3bucket="s3://BucketName"
s3dirpath="s3://BucketName/WithOrWithoutDirectoryPath/"
aws s3 ls $s3dirpath --recursive | while read -r line;
do
createDate=`echo $line|awk {'print " "'}`
createDate=`date -d"$createDate" +%s`
olderThan=`date --date "159 days ago" +%s`
if [[ $createDate -lt $olderThan ]]
then
fileName=`echo $line|awk '{a="";for (i=4;i<=NF;i++){a=a" "$i}print a}' |awk '{ sub(/^[ \t]+/, ""); print }'`
if [[ $fileName != "" ]]
then
#echo "$s3bucket/$fileName"
aws s3 rm "$s3bucket/$fileName"
fi
fi
done;
感谢您的回答,我稍微修改了 的那个,以便能够在 MacOsX 上执行 shell 脚本(我用 High 测试过塞拉利昂)
BUCKETNAME=s3://BucketName/WithOrWithoutDirectoryPath/
aws s3 ls $BUCKETNAME | while read -r line;
do
createDate=`echo $line|awk {'print " "'}`
createDate=`gdate -d"$createDate" +%s`
olderThan=`gdate '+%s' -d '1 week ago'`
if [[ $createDate -lt $olderThan ]]
then
fileName=`echo $line|awk {'print '}`
if [[ $fileName != "" ]]
then
echo "deleting " $BUCKETNAME$fileName
aws s3 rm $BUCKETNAME$fileName
fi
fi
done;
我一直在寻找 s3cmd 命令来删除超过 N 天的文件,这对我有用
s3cmd ls s3://your-address-here/ | awk -v dys="2" 'BEGIN { depoch=(dys*86400);cepoch=(systime()-depoch) } { gsub("-"," ",);gsub(":"," ", );if (mktime(" "" 00")<=cepoch) { print "s3cmd del " } }' | bash
我创建了以下脚本和 运行 cron。根据我的要求,脚本能够每天删除一个早于 8 天的备份文件,并且只能保留 7 天的备份文件,并且每天在这里生成一个文件。
#!/bin/bash
#Purpose: functional for 7 days backup retention policy
count=$(/usr/bin/sudo /usr/local/bin/aws s3 ls bucketname |nl|tail -n1|awk '{print }')
if [[ "$count" == 8 ]]
then
filename=$(/usr/bin/sudo /usr/local/bin/aws s3 ls bucketname|awk '{print $NF}'|head -n1)
/usr/bin/sudo /usr/local/bin/aws s3 rm s3://bucketname/$filename
fi
需要删除 Amazon S3 中超过 7 天的文件,需要 shell 脚本来执行此操作,google 搜索不成功,我找到了以下 url
http://shout.setfive.com/2011/12/05/deleting-files-older-than-specified-time-with-s3cmd-and-bash/
这对我们没有帮助,有人有删除超过 7 天的所有文件的脚本吗?
最简单的方法是在 Amazon S3 存储桶上定义 Object Lifecycle Management。
您可以指定超过特定天数的对象应该过期(删除)。最好的部分是,这会定期自动发生,您不需要 运行 自己的脚本。
如果您想自己做,最好是编写一个脚本(例如在 Python 中)来检索文件列表并删除早于特定日期的文件。
作为 shell 脚本来做有点麻烦。
谢谢,约翰
我们稍微修改了代码,现在运行良好。
aws s3 ls BUCKETNAME/ | while read -r line;
do
createDate=`echo $line|awk {'print " "'}`
createDate=`date -d"$createDate" +%s`
olderThan=`date --date "7 days ago" +%s`
if [[ $createDate -lt $olderThan ]]
then
fileName=`echo $line|awk {'print '}`
if [[ $fileName != "" ]]
then
aws s3 rm BUCKETNAME/$fileName
fi
fi
done;
这是我为我的环境编写的一个简单脚本,希望有人会觉得它有用。谢谢
而且,我的 s3 存储桶中的文件是 FULL_BACKUP_2020-06-25.tar.gz
格式。
#!/bin/bash
#Defining variables.
#Date=`date +%Y-%m-%d`
ThreeDaysOldDate=`date -d '-3 days' +%Y-%m-%d | tr -d '-'`
Obj=`/usr/local/bin/aws s3 ls s3://bucket_name/folder/ | sed -n '2,$'p | awk '{print }'| cut -b 13-22 | tr -d '-'`
#Comparing files older than past 3 days and removing them from S3.
for i in $Obj
do
if [ $i -lt $ThreeDaysOldDate ]; then
var1="FULL_BACKUP_"
var2=".tar.gz"
year=$(echo $i | cut -c 1-4)
mon=$(echo $i | cut -c 5-6)
day=$(echo $i | cut -c 7-8)
DATE=$var1$year-$mon-$day$var2
/usr/local/bin/aws s3 rm s3://bucket_name/folder/$DATE > /dev/null 2>&1
fi
done
这将从 S3 存储桶中递归删除 159 天前的文件。您可以根据需要更改日期。其中包括带空格的文件名。以上脚本不适用于带空格的文件名。
注意:现有目录结构可能会被删除。如果你不喜欢目录结构,你可以使用这个。
如果您更喜欢目录结构,请给出最后一个子目录的完整路径,并在每次执行时修改它以保护父目录结构。
示例:
s3://BucketName/dir1/dir2/dir3/
s3://BucketName/dir1/dir2/dir4/
s3://BucketName/dir1/dir2/dir5/
vim s3_file_delete.sh
s3bucket="s3://BucketName"
s3dirpath="s3://BucketName/WithOrWithoutDirectoryPath/"
aws s3 ls $s3dirpath --recursive | while read -r line;
do
createDate=`echo $line|awk {'print " "'}`
createDate=`date -d"$createDate" +%s`
olderThan=`date --date "159 days ago" +%s`
if [[ $createDate -lt $olderThan ]]
then
fileName=`echo $line|awk '{a="";for (i=4;i<=NF;i++){a=a" "$i}print a}' |awk '{ sub(/^[ \t]+/, ""); print }'`
if [[ $fileName != "" ]]
then
#echo "$s3bucket/$fileName"
aws s3 rm "$s3bucket/$fileName"
fi
fi
done;
感谢您的回答,我稍微修改了
BUCKETNAME=s3://BucketName/WithOrWithoutDirectoryPath/
aws s3 ls $BUCKETNAME | while read -r line;
do
createDate=`echo $line|awk {'print " "'}`
createDate=`gdate -d"$createDate" +%s`
olderThan=`gdate '+%s' -d '1 week ago'`
if [[ $createDate -lt $olderThan ]]
then
fileName=`echo $line|awk {'print '}`
if [[ $fileName != "" ]]
then
echo "deleting " $BUCKETNAME$fileName
aws s3 rm $BUCKETNAME$fileName
fi
fi
done;
我一直在寻找 s3cmd 命令来删除超过 N 天的文件,这对我有用
s3cmd ls s3://your-address-here/ | awk -v dys="2" 'BEGIN { depoch=(dys*86400);cepoch=(systime()-depoch) } { gsub("-"," ",);gsub(":"," ", );if (mktime(" "" 00")<=cepoch) { print "s3cmd del " } }' | bash
我创建了以下脚本和 运行 cron。根据我的要求,脚本能够每天删除一个早于 8 天的备份文件,并且只能保留 7 天的备份文件,并且每天在这里生成一个文件。
#!/bin/bash
#Purpose: functional for 7 days backup retention policy
count=$(/usr/bin/sudo /usr/local/bin/aws s3 ls bucketname |nl|tail -n1|awk '{print }')
if [[ "$count" == 8 ]]
then
filename=$(/usr/bin/sudo /usr/local/bin/aws s3 ls bucketname|awk '{print $NF}'|head -n1)
/usr/bin/sudo /usr/local/bin/aws s3 rm s3://bucketname/$filename
fi