﻿# 在 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
```

你說神不神奇呢？！ ^\_^
