💡
S3上のいらないファイルをリストアップして削除する
経緯
S3にあるいらないファイルをまとめて削除したかった
環境
- bash
- AWS CLI
前提
- S3バケットの全ファイル
- list1.txt
-
aws s3 ls
でリストアップする
-
- list1.txt
- 使用中のファイルのリスト
- list2.txt
- 任意に準備
- (注意)ディレクトリ名だけだとディレクトリごと削除してしまう
- list2.txt
例
list1.txt
assets/css/test1.css
assets/css/test2.css
assets/js/test1.js
assets/js/test2.js
list2.txt
assets/css/test2.css
assets/js/test2.js
このとき、以下の2つのファイルを削除したい
assets/css/test1.css
assets/js/test1.js
概要
- 以下に当てはまる行をリストアップする
- list1にはある
- list2にはない
-
aws s3 rm
で、1. でリストアップしたファイルを削除する
手順
-
sh main.sh <PROFILE>
2. PROFILE=~/.aws/config
で設定したプロファイル名
スクリプト
s3.sh
#!/bin/bash
ENV=$1
PROFILE=$2
function listup_s3 () {
aws s3 ls s3://hogehoge --recursive | awk '{print $4}' > tmp03.txt
# ディレクトリ名のみの行を削除する
sed '/\/$/d' tmp03.txt > list1.txt
}
function cleanup () {
while read line
do
aws s3 rm s3://hogehoge/${line} --profile ${PROFILE} >> deleted_files.txt
done < target.txt
}
check.sh
#!/bin/bash
function listup_targets () {
while read line
do
x=0
while read hoge
do
# list2.txt[m]行目がlist1.txt[n]行目に存在するか確認
flg=$(echo $hoge | grep $line)
# flgが立ってる
if [ -n "$flg" ]; then
x=1
break
fi
done < list2.txt
if [ $x -eq 0 ]; then
echo $line >> target.txt
elif [ $x -eq 1 ]; then
echo 'it is in use: '$line
fi
done < list1.txt
}
main.sh
#!/bin/bash
. ./s3.sh
. ./check.sh
PROFILE=$1
listup_s3 $PROFILE
listup_targets
cleanup $PROFILE
Discussion