勉強メモ29_Linuxサーバーで稼働しているアプリケーションで不要なファイルを大量削除しないといけない作業に遭遇した場合のメモ

##0 はじめに
Linuxサーバで稼働しているアプリケーションの中で大量の使っていないソースやディレクトリーを削除する作業に遭遇した場合のやり方の手順メモです。
※やり方は人それぞれのやり方があると思っています。


##1 以下例とて、アプリのディレクトリ構成と削除する対象ファイルを記載しています

```shell
/home
  |-rinchome
       |-lsDeleteFileList.sh ※削除対象一覧ファイルを表示シェル
       |-rmDeleteFileList.sh ※削除対象一覧ファイルの削除シェル
       |-mvFileList.sh ※削除対象一覧ファイルの削除処理失敗時の切り戻しシェル
       |-paypayApuriBackUp_YYYYMMDD ※paypayApuriのバックアップ用ディレクトリ
       |-paypayApuri.list.YYYYMMDD.AllList ※paypayApuriディレクトリーに格納されているファイル一覧
       |-paypayApuriBackUp_YYYYMMDD.AllList  ※paypayApuriバックアップディレクトリーに格納されているファイル一覧
       |-paypayApuri.list.YYYYMMDD.AllList.after ※削除処理実行後にpaypayApuriディレクトリーに格納されているファイル一覧
       |-result
           |-ls_before.list.YYYYMMDD ※削除実施前のlsコマンド実施結果
           |-ls_after.list.YYYYMMDD ※削除実施前のlsコマンド実施結果      

/usr
 |- paypayApuri
        |-controller
        |     |-IndexCon.java
        |     |-Index2Con.java ←今回不要なので削除する
        |     |-LoginCon.java
        |     |-Login2Con.java ←今回不要なので削除する 
        |
        |-logic
        |   |-IndexLogic.java
        |   |-Index2Logic.java ←今回不要なので削除する
        |   |-LoginLogic.java
        |   |-Login2Logic.java
        |
        |-dto
        |  |-IndexDto.java
        |  |-Index2Dto.java ←今回不要なので削除する
        |  |-LoginDto.java
        |  |-Login2Dto.java
        |
        |-dao
           |-IndexDao.java
           |-Index2Dao.java
           |-LoginDao.java
           |-Login2Dao.java ←今回不要なので削除する
```

##2 まず削除対象のシェルを用意してサーバーの該当ディレクトリ(/home/rinchome/)に配置 ※シェルファイルの権限は、755にする

1、削除対象lsコマンドを用意する

```shell:lsDeleteFileList.sh

ls /usr/paypayApuri/controller/Index2Con.java
ls /usr/paypayApuri/controller/Login2Con.java
ls /usr/paypayApuri/logic/Index2Logic.java
ls /usr/paypayApuri/dto/Index2Dto.java
ls /usr/paypayApuri/dao/Login2Dao.java
```

2、削除対象rmコマンドを用意する

```shell:rmDeleteFileList.sh

rm /usr/paypayApuri/controller/Index2Con.java
rm /usr/paypayApuri/controller/Login2Con.java
rm /usr/paypayApuri/logic/Index2Logic.java
rm /usr/paypayApuri/dto/Index2Dto.java
rm /usr/paypayApuri/dao/Login2Dao.java
```

##3 削除対象ファイルの削除を実施する前に、アプリケーション全ての関連ファイルのバックアップを行う

```shell

#1 paypayApuriのバックアップ用ディレクトリ作成
$ mkdir -p /home/rinchome/paypayApuriBackUp_$(date +"%Y%m%d")/
#2 paypayApuriのディレクトリーを#1で作成したバックアップディレクトリーにコピー
#sudoにしなくてもいい
$ sudo cp -rp /usr/paypayApuri/. /home/rinchome/paypayApuriBackUp_$(date +"%Y%m%d")/
#3 paypayApuriのディレクトリーとバックアップディレクトリーに作成したファイル一覧作成
$ find /usr/paypayApuri/ -type f | sort > /home/rinchome/paypayApuri.list.$(date +"%Y%m%d").AllList
$ find /home/rinchome/paypayApuriBackUp_$(date +"%Y%m%d")/ -type f | sort > /home/rinchome/paypayApuriBackUp_$(date +"%Y%m%d").AllList
#4 #3の作成結果を比較して差分がなくバックアップされているかを確認
$ wc -l /home/rinchome/paypayApuri.list.$(date +"%Y%m%d").AllList /home/rinchome/paypayApuriBackUp_$(date +"%Y%m%d").AllList
$ diff <(cat /home/rinchome/paypayApuri.list.$(date +"%Y%m%d").AllList | sed -e 's/\/usr\/paypayApuri\///') <(cat /home/rinchome/paypayApuriBackUp_$(date +"%Y%m%d").AllList |sed -e 's/\/home\/rinchome\/paypayApuriBackUp_[0-9]\{8\}\///')

```

##4 削除対象ファイルの削除を行う

```shell
#0 resultディレクトリーを作成する
$ mkdir -p /home/rinchome/result
#1 削除実施前lsコマンドの実施し、結果をファイル出力
$ /home/rinchome/lsDeleteFileList.sh > /home/rinchome/result/ls_before.list.$(date +"%Y%m%d")
#2 削除処理実施 
$ /home/rinchome/rmDeleteFileList.sh
#3 削除実施後lsコマンドの実施し、結果をファイル出力
$ /home/rinchome/lsDeleteFileList.sh > /home/rinchome/result/ls_after.list.$(date +"%Y%m%d")
#4 削除されていることを確認する(ファイルが空であればOK)
$ head /home/rinchome/result/ls_after.list.$(date +"%Y%m%d")
```

##5 削除結果を確認する ※paypayApuri.list.$(date +"%Y%m%d").AllList.afterには、削除していないファイルが全てあること

```shell
#1 paypayApuriのファイル一覧をもう一度作成
$ find /usr/paypayApuri/ -type f | sort > /home/rinchome/paypayApuri.list.$(date +"%Y%m%d").AllList.after
#2 削除処理実施前後のpaypayApuriのファイル一覧を比較(削除ファイル一覧が出力される)
$ diff /home/rinchome/paypayApuri.list.$(date +"%Y%m%d").AllList.after /home/rinchome/paypayApuri.list.$(date +"%Y%m%d").AllList | sed -e 's/^[0-9a-zA-Z,]*//g' | sort -u > /home/rinchome/result/rmDelete_paypayApuri.list.$(date +"%Y%m%d")

```

##6 もし失敗した場合は元の状態に切り戻す

１、切り戻しシェルを用意する(シェルの権限は755にする)

```shell:mvFileList.sh

mv /home/rinchome/paypayApuriBackUp_$(date +"%Y%m%d")/controller/Index2Con.java /usr/paypayApuri/controller/
mv /home/rinchome/paypayApuriBackUp_$(date +"%Y%m%d")/controller/Login2Con.java /usr/paypayApuri/controller/
mv /home/rinchome/paypayApuriBackUp_$(date +"%Y%m%d")/logic/Index2Logic.java /usr/paypayApuri/logic
mv /home/rinchome/paypayApuriBackUp_$(date +"%Y%m%d")/dto/Index2Dto.java /usr/paypayApuri/dto
mv /home/rinchome/paypayApuriBackUp_$(date +"%Y%m%d")/dao/Login2Dao.java /usr/paypayApuri/dao

# paypayApuriの一覧をもう一度作成
find /usr/paypayApuri/ -type f | sort > /home/rinchome/paypayApuri.list.$(date +"%Y%m%d").AllList.Kirimodoshi


```

２、切り戻しシェルを実行し、切り戻しされたことを確認する（差分がないこと）

```shell
$ /home/rinchome/mvFileList.sh
$ diff /home/rinchome/paypayApuri.list.$(date +"%Y%m%d").AllList /home/rinchome/paypayApuri.list.$(date +"%Y%m%d").AllList.Kirimodoshi
```

##7 おしまい