Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

YYYYMMDD形式で保存された日付ディレクトリをローテートしたい(削除・圧縮)

More than 3 years have passed since last update.

dateコマンドを利用して日付名ディレクトリを削除・圧縮したい

毎日保存されるSQLログがディスク圧迫の原因になっていたのでローテートスクリプトを作成して対処しました。
というのも、本来ローテートすべきログをそのままにしていたためです。
大きく分けてスクリプトの内容は圧縮・削除がメインです。

findコマンドではなくdateコマンドを利用した理由

ファイルやディレクトリ検索のコマンドといえばfindですが、今回このコマンドは使用しませんでした。
findコマンドは、”タイムスタンプを参照して指定した日付より古いファイルを削除する”みたいなことができます。
しかしながら、それはあくまでタイムスタンプを参照します。
そのため、削除したくないファイルであっても指定した期間より古ければ削除対象になってしまいます。
あくまで、YYYYMMDD形式で一定期間より古いとされるディレクトリを削除させたかったので、今回はdateコマンドで日付を取得させる方針にしました。

dateコマンドにした理由のちょいまとめ

  • 削除対象ディレクトリ内に”削除したくない”ファイルが存在していたから
  • 削除対象のディレクトリはあくまでYYYYMMDD形式のものだったから

デイリーでちょうど二年前のディレクトリを削除し、ちょうど一ヶ月前のディレクトリを圧縮する

ローテート方針

  • ちょうど一ヶ月前の日付ディレクトリを圧縮していく
  • ちょうど二年前の日付ディレクトリを削除していく
  • cronに設定し、dailyで実行する
  • 圧縮後のディレクトリ名は"YYYYMMDD.zip"にする
  • 圧縮後、元のディレクトリは削除する

以下の場所に作成したスクリプトを配置しました。
これで毎日、「一ヶ月前の日付ディレクトリが圧縮され、一年前の日付ディレクトリが削除され続ける」ようになります。

/etc/corn.daily/zip.sh
#!bin/sh
date1=`date "+%Y%m%d" -d "1 month ago"`
date24=`date "+%Y%m%d" -d "24 month ago"`
rmdate732=`date "+%Y%m%d" -d "732 day ago"`
logdir=<対象ディレクトリ>
zip -r "$logdir$date1".zip $logdir$date1
rm -rf $logdir$date24
rm -rf "$rmdate732".zip
rm -rf $logdir$date1

rm -rfコマンドが含まれています。実行する場合はご自身の環境に合わせて一度テストなどするようにしてください

二年以上前のディレクトリを削除する(一度だけ実行する)

デイリーでのローテート設定は完了しました。翌日以降、対象ディレクトリが圧縮・削除されていれば問題ないです。
しかしまだ終わりではありません。私が作業している環境だと、二年以上前となった日付ディレクトリがたくさん残っています。
実質これらが圧迫の主な原因な上、削除対象なので削除してしまいたいと思います。

  • 例:2017/2/17(当日)→ ~2015/2/16までを削除。

任意の場所に以下のスクリプトを作成しました。このスクリプトは一度実行すれば削除対象のディレクトリが削除されます。

delete_24month_ago.sh
#!/bin/sh
#2年から6年前までのディレクトリを削除する

a=731
cd 対象ディレクトリ
while [[ $a -ne 2190 ]]; do

  a=`expr $a + 1`
  dateRoop=`date "+%Y%m%d" -d "$a day ago"`

    if [[ -e $dateRoop ]]; then
      rm -rf "$dateRoop"* 2>> /home/USERDIR/rotate.log
    fi

done
cd ~

rm -rfコマンドが含まれています。実行する場合はご自身の環境に合わせて一度テストなどするようにしてください

一ヶ月前から二年前までのディレクトリを圧縮する(一度だけ実行する)

ここまでの作業を実施すると、以下のような状況になっているかと思います。

  • 二年以上前までの日付ディレクトリは削除されている
  • 翌日から、ちょうど一ヶ月前の日付ディレクトリは圧縮される
  • 翌日から、ちょうど二年前の日付ディレクトリが削除される

つまり、この時点ではまだ何もされず残っている日付ディレクトリが存在しています。

つまり、一ヶ月前~二年前までの日付ディレクトリです。
これらのディレクトリも圧縮しておけば、整合性が取れるので作業完了です。

このスクリプトも任意のディレクトリに作成します。このスクリプトは一度実行すれば対象のディレクトリが圧縮されます。

#!/bin/sh
a=31
cd <対象ディレクトリ>
while [[ $a -ne 732 ]]; do

  a=`expr $a + 1`
  dateRoop=`date "+%Y%m%d" -d "$a day ago"`

    if [[ -e $dateRoop ]]; then
      zip -r "$dateRoop".zip $dateRoop 2>> /home/USERDIR/rotate.log
    fi

  rm -rf $dateRoop 2>> /home/USERDIR/rotate.log

done
cd ~

rm -rfコマンドが含まれています。実行する場合はご自身の環境に合わせて一度テストなどするようにしてください

おわりに

dateコマンド、意外と便利なんだなーと思いました。「タイムスタンプで検索して古いもの削除~」とするなら、findコマンドのほうがあっさり終わりそうですね。
実際、ネットでdateコマンドを利用してファイルやらを削除する話はあまりみられませんでした。
※単にもっと簡単なやり方があるだけなのかもしれませんが・・・

ともあれ誰かの役に立つことがあればと思います。

VTRyo
五反田でエンジニアをしています。 AWS / Kubernetes / CircleCI ブログサイトで技術ブログを書くようになりました。
https://blog.vtryo.me
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away