💡

S3上のいらないファイルをリストアップして削除する

2022/03/01に公開

経緯

S3にあるいらないファイルをまとめて削除したかった

環境

  • bash
  • AWS CLI

前提

  • S3バケットの全ファイル
    • list1.txt
      • aws s3 lsでリストアップする
  • 使用中のファイルのリスト
    • 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

概要

  1. 以下に当てはまる行をリストアップする
    • list1にはある
    • list2にはない
  2. aws s3 rmで、1. でリストアップしたファイルを削除する

手順

  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