保持期限を過ぎたファイルをタイムスタンプではなく、ファイル名に含まれる日付から判断して削除するシェルスクリプトを bash で書いてみた。
- delete.sh
#!/bin/bash EXPIRE_DATE=`date -d '-31 days' '+%Y%m%d'` find ./log -name "*.log"|while read LINE do # FILE_DATE=`basename ${LINE}|perl -pe 's/.*([0-9]{4})-([0-9]{2})-([0-9]{2})-[0-9]{6}.*/$1$2$3/'` FILE_DATE=`basename ${LINE}|perl -ne 'if(($y,$m,$d)=$_=~/^[a-zA-Z0-9\-\_]+([0-9]{4})-([0-9]{2})-([0-9]{2})-[0-9]{6}\.[a-zA-Z0-9\.]+$/){print "$y$m$d"}else{print 0}'` # if [ "$FILE_DATE" -lt "$EXPIRE_DATE" ]; then if [[ "$FILE_DATE" -ne 0 && "$FILE_DATE" -lt "$EXPIRE_DATE" ]]; then rm -f "${LINE}" fi done
実行してみるとこんな感じ。
$ mkdir log $ cd log $ touch a $ perl -MFile::Copy -e 'for (1..31) {copy('a',sprintf("2009-11-%02d-000000.log",$_));}' $ perl -MFile::Copy -e 'for (1..31) {copy('a',sprintf("2009-12-%02d-000000.log",$_));}' $ ls -1 2009-11-01-000000.log 2009-11-02-000000.log 2009-11-03-000000.log . . . 2009-12-29-000000.log 2009-12-30-000000.log 2009-12-31-000000.log a $ cd .. $ ./delete.sh $ ls -1 log 2009-11-21-000000.log 2009-11-22-000000.log. 2009-11-23-000000.log. . . . 2009-12-29-000000.log 2009-12-30-000000.log 2009-12-31-000000.log a