我需要删除Amazon S3中超过七天的文件。我需要一个shell脚本来完成这个任务,但是在谷歌搜索中没有找到合适的结果。我找到了下面的URL:
http://shout.setfive.com/2011/12/05/deleting-files-older-than-specified-time-with-s3cmd-and-bash/
这对我们没有帮助。有什么脚本可以删除七天前的所有文件吗?http://shout.setfive.com/2011/12/05/deleting-files-older-than-specified-time-with-s3cmd-and-bash/
这对我们没有帮助。有什么脚本可以删除七天前的所有文件吗? aws s3 ls BUCKETNAME/ | while read -r line;
do
createDate=`echo $line|awk {'print $1" "$2'}`
createDate=`date -d"$createDate" +%s`
olderThan=`date --date "7 days ago" +%s`
if [[ $createDate -lt $olderThan ]]
then
fileName=`echo $line|awk {'print $4'}`
if [[ $fileName != "" ]]
then
aws s3 rm BUCKETNAME/$fileName
fi
fi
done;
Syntax error: "done" unexpected (expecting "then")
- Umair Ayubaws s3 ls BUCKETNAME/ --recursive
,脚本就可以处理包含斜杠字符的路径,例如BUCKETNAME/V1/V2/
。 - 3lRickos3cmd ls s3://your-address-here/ | awk -v dys="2" 'BEGIN { depoch=(dys*86400);cepoch=(systime()-depoch) } { gsub("-"," ",$1);gsub(":"," ",$2 );if (mktime($1" "$2" 00")<=cepoch) { print "s3cmd del "$4 } }' | bash
s3cmd ls -r s3://your-address-here/ | awk -v dys="2" 'BEGIN { depoch=(dys*86400);cepoch=(systime()-depoch) } { gsub("-"," ",$1);gsub(":"," ",$2 );if (mktime($1" "$2" 00")<=cepoch) { print "s3cmd del "$4 } }' | bash
- Franti3ek截至2023年10月,最简单的方法
我在一个多租户设置中遇到了类似的情况,其中一个用户可以创建N个存储桶,每个存储桶的保留期限不同。由于我在数据库级别上有所有与存储桶相关的配置信息,所以简单地使用s3cmd expire命令就完成了工作。
设置过期时间:
s3cmd expire s3://BUCKET_PATH --expiry-days 7 --access_key=ACCESS_KEY --secret_key=ACCESS_KEY
生命周期列表:
s3cmd getlifecycle s3://BUCKET_PATH --access_key=ACCESS_KEY --secret_key=SECRET_KEY
基于@Prabhu R提出的解决方案,我修补了代码并添加了变量。
因此,如果您将以下内容保存为cleanup.sh,则可以运行:
./cleanup.sh <bucket_name> <days_beyond_you_want_files_removed | number>
#!/bin/bash
aws s3 ls $1/ --recursive | while read -r line;
do
createDate=`echo $line|awk {'print $1" "$2'}`
createDate=`date -d"$createDate" +%s`
olderThan=`date --date "$2 days ago" +%s`
if [[ $createDate -lt $olderThan ]]
then
fileName=`echo $line|awk {'print $4'}`
if [[ $fileName != "" ]]
then
aws s3 rm s3://$1/$fileName
fi
fi
done;
#!/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 $1}')
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
这将递归删除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 $1" "$2'}`
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 $1" "$2'}`
createDate=`gdate -d"$createDate" +%s`
olderThan=`gdate '+%s' -d '1 week ago'`
if [[ $createDate -lt $olderThan ]]
then
fileName=`echo $line|awk {'print $4'}`
if [[ $fileName != "" ]]
then
echo "deleting " $BUCKETNAME$fileName
aws s3 rm $BUCKETNAME$fileName
fi
fi
done;
#!/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 $4}'| 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