30日前の古いデータをfindとxargsを使って自動的に削除を実現する

ログが延々と肥大化するのを何とかしたい

ログやバックアップを毎日とっていると、毎日のデータが延々と溜まっていきますが、findには◯日前の更新があったファイルをピックアップするオプションがあるので、これを利用して日々作成した一定のファイルを消してログローテションを実現します。

findのオプションとxargs

findには様々なオプションがありますが、mtimeオプションを入れると何日前に更新されたファイルをリストアップすることができますが、これだけでは消すことができないのでxargsを利用してリストアップされたファイルに対してコマンドを投げることができます。

findの例

findで5日前より古いデータのみを表示する例


$ find . -mtime +5

findで5日前より新しいデータのみを表示する例


$ find . -mtime -5

-と+では全然意味が変わってくるので注意してください
+にするとそれよりも古いもの -だと指定日数よりも新しいものをピックアップします。

xargs

lsで表示したファイルに対してrmを行う例


$ touch a
$ touch b
$ touch c
$ ls 
a b c
$ ls | xargs rm
$ ls


あんまり意味が無い例ですがファイルが消されています。

毎日のバックアップを指定日数よりも古いものを削除する例

cronにmongodbを毎日バックアップする想定です

/etc/cron.dialy/mongo_backup


BACKUP_FILE=`date +"%Y%m%d-%H%M%S"`.tar.gz

#!/bin/sh
mongodump --out /tmp/dump
tar zcf /tmp/backup/$BACKUP_FILE /tmp/dump
rm -rf /tmp/dump
find /tmp/backup/ -type f -mtime +30 | xargs rm -f

mongodumpで出力したものに対して圧縮をかけて/var/backups/mongo/dumpへ保存して、
その後に30日よりも古いものをfindで探してxargsを利用して削除を行っています。

こんなかんじでログファイルやらバックアップファイルが肥大化するのを防ぐことができます。