最近自宅サーバーで遊ぶ機会がない。

ところで、DB(PostgreSQL)のバックアップを毎晩取り、かつ最新の30個を残すというのを自動でやらんといけんくなった。ネットを探すと更新日時で削除する(findでmtimeを見る)というのばっかりヒットする。正確にファイル30個だけ残し、かつそれが最新30個であり、かつそれ以外は削除するというのはどうすれば良いのか。こんなBASHスクリプトを書いてみた。当然バックアップを取るディレクトリー内で実行する。想定ディストリはRedhat Enterprise Linux 5。

for f in `ls -1r | tail -n +31`
do
 rm -r -f $f
done

バックアップファイル名は「db`date +%Y%m%d%H%M%S`.pgdump」などのように日付とか入るようにする。これを逆順に並び替えて一行に一ファイル名を吐き出させ、それをtailで31行目からを切り出し、選ばれたファイルを逐次削除していくわけだ。ファイル名ではなく更新日時が最も新しい30個を残したければ、

for f in `ls -1tr | tail -n +31`
do
 rm -r -f $f
done

とlsのオプションにtを加えてやる。rmにrオプションが付いているのはディレクトリーの場合に削除できないのを防ぐためだ。if-fとかif-dとかif-xとか判定を組み合わせてもいいだろう。

Windowsの場合はこんなコマンドが近い動きか。

for /F "skip=30" %f in ('dir /b /w /o-n') do del %f