The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

在 Linux 下的 Bash 如何取得「昨天」的日期格式字串

我之前曾經寫過一個 Shell Script 要找出「昨天」的 Apache Log,找到後會自動用 bzip2 壓縮,但這段程式我記得當時寫的十分痛苦,因為實在很難組合出一個「昨天」的字串格式,當時我的程式碼如下:

YEAR=`date +%y`
MON=`date +%m`
DAY=`date +%d`
# Log for www.example.com
#-----------------------------------------------------------------
LOG_DIR=/var/log/apache2
for filename in `ls -1 $LOG_DIR/ex*.log`;
do
    if [[ $filename != $LOG_DIR/"ex$YEAR$MON$DAY.log" ]]; then
        bzip2 -q -9 -s $filename;
    fi
done

看到了沒?我寫的方法有多笨阿!我竟然是先抓今天的日期出來,然後取出目錄中所有檔案,並且一一比對該檔案是否為「當天的檔案」,如果不是的話就進行壓縮。

但我最近發現原來 date 指令還有一個很棒的用法,要找到昨天的日期原來可以用以下語法達成:

date -d 'yesterday' +%Y-%m-%d

如果要找到昨天的 Log 檔名,可以用以下語法:

date -d 'yesterday' +ex%Y%m%d.log

今天重寫了一遍當時的程式,你看這種 shell script 才叫做乾淨啊!

LOG_DIR=/var/log/apache2
LOG_NAME=`date -d 'yesterday' +ex%y%m%d.log`
bzip2 -q -9 -s $LOG_DIR/$LOG_NAME

神奇的是,如果你要找 3 天前的 Log 檔案,可以用以下語法:

date -d '3 days ago' +ex%Y%m%d.log

如果要得到下週一的日期字串,可以用以下語法:

date -d 'next Mon' +%Y-%m-%d

你說神不神奇呢?! ^_^