自動化腳本中常需計算「昨天」、「前天」等相對日期以處理日誌輪轉、備份命名等任務。date 指令的 -d 參數支援豐富的自然語言時間表達,以下整理常用格式供快速查閱。
| 需求 | 指令範例 | 輸出範例 (假設今天 2024-01-15) |
|---|---|---|
| 昨天 | date -d 'yesterday' +\"%Y_%m_%d\" | 2024_01_14 |
| 昨天 (替代寫法) | date -d '-1 day' +\"%Y_%m_%d\" | 2024_01_14 |
| 昨天 (另一種寫法) | date -d '1 days ago' +\"%Y_%m_%d\" | 2024_01_14 |
| 前天 | date -d '-2 day' +\"%Y_%m_%d\" | 2024_01_13 |
| 前天 (替代寫法) | date -d '2 days ago' +\"%Y_%m_%d\" | 2024_01_13 |
| 大前天 | date -d '-3 day' +\"%Y_%m_%d\" | 2024_01_12 |
| 大前天 (替代寫法) | date -d '3 days ago' +\"%Y_%m_%d\" | 2024_01_12 |
| 明天 | date -d 'tomorrow' +\"%Y_%m_%d\" | 2024_01_16 |
| 明天 (替代寫法) | date -d '+1 day' +\"%Y_%m_%d\" | 2024_01_16 |
| 一週前 | date -d '-1 week' +\"%Y_%m_%d\" | 2024_01_08 |
| 一個月前 | date -d '-1 month' +\"%Y_%m_%d\" | 2023_12_15 |
| 一年後 | date -d '+1 year' +\"%Y_%m_%d\" | 2025_01_15 |
| 本月第一天 | date -d '$(date +%Y-%m-01)' +\"%Y_%m_%d\" | 2024_01_01 |
| 上月最後一天 | date -d '$(date +%Y-%m-01) -1 day' +\"%Y_%m_%d\" | 2023_12_31 |
#!/bin/bash
# 每天 00:00 執行,打包昨天日誌並移至遠端儲存 (NFS 掛載點)
LOG_DIR="/var/log/nginx"
BACKUP_DIR="/mnt/nfs/logs_backup"
DATE_STR=$(date -d 'yesterday' +\"%Y_%m_%d\")
cd $LOG_DIR
tar -czf ${BACKUP_DIR}/access_${DATE_STR}.tar.gz access_${DATE_STR}.log
# 驗證備份成功後再刪除本地檔案
if [ $? -eq 0 ]; then
rm -f access_${DATE_STR}.log
logger "Log rotation done for ${DATE_STR}"
else
logger "Log rotation FAILED for ${DATE_STR}"
fi
# 每天 00:05 執行日誌輪轉腳本
05 0 * * * /usr/local/bin/rotate_nginx_logs.sh >> /var/log/rotate.log 2>&1
# 完整時間戳
date -d 'yesterday' +\"%Y-%m-%d %H:%M:%S\"
# 2024-01-14 00:00:00
# Unix 時間戳 (秒)
date -d 'yesterday' +%s
# 1705161600
# ISO 8601 格式
date -d 'yesterday' -Iseconds
# 2024-01-14T00:00:00+08:00
# 自訂格式:年月日_時分秒
date -d '-2 day' +\"%Y%m%d_%H%M%S\"
# 20240113_000000
-d 參數為 GNU date 擴充功能,BSD/macOS 版 date 需使用 -v 參數 (如 date -v-1d)-1 month 在 3/31 會回到 2/28/29,非 2/31,符合直覺但需留意date 呼叫極快,但在大量迴圈中建議捕獲一次基準時間再運算善用 date -d 的自然語言解析,能大幅簡化 Shell 腳本中的日期運算邏輯,配合 crontab 即可構建可靠的自動化維護體系。