ablog

不器用で落着きのない技術者のメモ

保持期限を過ぎたファイルを削除するシェルスクリプト

保持期限を過ぎたファイルをタイムスタンプではなく、ファイル名に含まれる日付から判断して削除するシェルスクリプト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