特定の期間以上経過したファイルを削除するスクリプト処理

# はじめに
31日以上前のファイルを定期的に削除するスクリプトを作成し、cronで定期削除する設定をしましたので、まとめます。

# 前提条件
サーバーは、EC2のlinuxになります。

# 処理の詳細

結論から言いますと、毎日、以下の通りにスクリプト処理を実行できるようにします。
- 0時：31日以上前の不要ファイルを`trash`ディレクトリに移動
- 1時：EC2のスナップショット（バックアップ）を作成（今回説明はしません）
- 2時：`trash`ディレクトリを削除し、空の`trash`ディレクトリを再作成


今回は、ルートディレクトリを`test`として、その配下に`testA`、更に配下に`testA`を設置します。
今回の目的は、`test`、`testA`、`testB`ディレクトリ内の31日以上前の不要ファイルを削除します。
（以後不要ファイルは、31日以上前のファイルを指します。）
```
.test
└── testA
    └── testB
```
削除するに当たり、`trash`というディレクトリを作成し、`trash`ディレクトリ配下に、`testA、testB`の同様のディレクトリを作成します。

`trash`ディレクトリを作成する理由は、不要ファイルを`trash`ディレクトリに移動したあとに、一度バックアップをとったうえで、削除するためです。
万が一削除してほしくないファイルを削除した場合、リカバリできますので。

```
.test
├── testA
│   └── testB
└── trash
    └── testA
        └── testB
```

# スクリプト処理を作成
先程も説明しましたが、スクリプト処理は、不要ファイルを移動させる処理と、削除する処理の２つに分かれます。

- 0時：31日以上前の不要ファイルを`trash`ディレクトリに移動
- 1時：EC2のスナップショット（バックアップ）を作成（今回説明はしません）
- 2時：`trash`ディレクトリを削除し、空の`trash`ディレクトリを再作成

不要ファイルを移動させる処理を`move-unnecessary-files.sh`
削除する処理を`delete-unnecessary-files.sh`とします。

今回、この２つのファイルは、`test`ディレクトリ内に`script`ディレクトリを作成し、そのディレクトリ内に設置します。
```
.test
├── script
│   ├── move-unnecessary-files.sh
│   └── delete-unnecessary-files.sh
├── testA
│   └── testB
└── trash
    └── testA
        └── testB
```

## 不要ファイルを移動させる処理
```sh:move-unnecessary-files.sh
#!/bin/sh
sudo find /test/ -maxdepth 1 -daystart -mtime +31 -name "*.html" | xargs sudo mv -t /test/trash
sudo find /test/testA/ -maxdepth 1 -daystart -mtime +31 -name "*.html" | xargs sudo mv -t /test/trash/testA
sudo find /test/testA/testB/ -maxdepth 1 -daystart -mtime +31 -name "*.html" | xargs sudo mv -t /test/trash/testA/testB
```
`maxdepth`は、検索する深さを指定しています。`-maxdepth 1`の場合、カレントディレクトリのみを検索します。
`-mtime +31`は、32日以上前のファイルを指定しています。
`-name "*.html"`は、htmlファイルに限定しています。

上記の設定によって、不要ファイルを`trash`のディレクトリに移動させることができます。

## 削除する処理

```sh:delete-unnecessary-files.sh
#!/bin/sh
sudo rm -r /test/trash
sudo mkdir -m 755 /test/trash
sudo mkdir -m 755 /test/trash/{testA,testA/testB}
sudo chown -R ec2-user:ec2-user /test/trash
```
`mkdir`は、`{testA,testA/testB}`という書き方をすることで、複数のディレクトリを作成することができるようです。
`-m 755`で権限も同時に設定できます。
`chown`で設定する所有者とグループは、適宜変えてください。

# cron設定
今回は、EC2でcronを設定しますが、EC2にssh接続し、`date`コマンドで日本時間かどうか確認してください。

設定されていない場合、こちらの記事で設定してください。
厳密には、UTCのままでもよいですが。

https://qiita.com/drapon/items/2fc5b21a9cdc31ddb152

タイムゾーンを変更した場合、cronのジョブに反映させるためにはcrondの再起動が必要な場合があります。
```
$ sudo service crond restart
```

では、スクリプト処理のファイルを２つ設置しましょう。
```
.test
├── script
│   ├── move-unnecessary-files.sh
│   └── delete-unnecessary-files.sh
├── testA
│   └── testB
└── trash
    └── testA
        └── testB
```

所有者がrootになっている場合、適宜変更しましょう。
```terminal

$ ls -la test/
合計 0
drwxr-xr-x  5 root     root      45  5月 27 00:19 .
dr-xr-xr-x 19 root     root     269  5月 27 00:09 ..
drwxr-xr-x  2 root     root      74  5月 27 00:17 scipt
drwxr-xr-x  3 root     root      19  5月 27 00:10 testA
drwxr-xr-x  3 root root  19  5月 27 00:19 trash



$ ls -la test/scipt/
合計 8
drwxr-xr-x 2 root root  74  5月 27 00:17 .
drwxr-xr-x 5 root root  45  5月 27 00:19 ..
-rw-r--r-- 1 root root 157  5月 27 00:15 delete-unnecessary-files.sh
-rw-r--r-- 1 root root 334  5月 27 00:15 move-unnecessary-files.sh


$ sudo chown ec2-user:ec2-user -R test/
```

cronが起動しているか確認してから設定しましょう。EC2は、デフォルトで起動しています。

```terminal
$ service crond status
  Active: active (running)

$ crontab -e
```

```crontab:cron
# 毎日定期削除 タイムゾーンは日本
0 0 * * * /test/script/move-unnecessary-files.sh
0 2 * * * /test/script/delete-unnecessary-files.sh
```

これで設定完了です。

実行されたかどうか確認するため、logを確認しましょう。

```terminal
$ sudo tail -f /var/log/cron

May 20 00:00:01 ip-xxxxxxxx CROND[11052]: (ec2-user) CMD (/test/script/move-unnecessary-files.sh)
May 20 02:00:01 ip-xxxxxxxx CROND[11052]: (ec2-user) CMD (/test/script/delete-unnecessary-files.sh)
```


# 実行されない場合
ログでパーミッションエラーが出た場合、ディレクトリやファイルの所有者や権限を確認しましょう。

また、直接スクリプトを実行し、問題ないか確認してみましょう。
```terminal
$ source /test/scipt/move-unnecessary-files.sh

$ source /test/scipt/delete-unnecessary-files.sh
```

# テスト用の不要ファイルを作成
上記のスクリプト処理ができているかテストするために、32日以上前のファイルを作成しましょう。
以下のコマンドで、2022年1月1日12:00のファイルを作成することができます。
```
$ touch -t 202201011200.00 abc.html
```

そして、cronで削除されているか確認できますね。


# 参考

https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337

https://www.yoheim.net/blog.php?q=20190902

https://blog.mothule.com/tools/how-to-use-cron

https://qiita.com/kuriya/items/04c70017753ae85aa675