透過定時執行腳本完成一些自動化的工作,常常會需要使用時間來命名一些檔案。例如我想要一個檔案名稱是透過現在的日期產生的,同時包含年月日時分秒,像是「log_20220628_123000.txt」,該如何透過Linux腳本或是Windows腳本自動產生呢?本文將教學Linux與Windows各自的產生方式。


Linux Shell Script

在Linux上透過Bash之類的Shell會非常容易完成,假設要產生一個「log_20220628_123000.txt」的檔案名稱,以下是範例,是不是很簡單呢?

today=$(date "+%Y%m%d_%H%M%S")
filename=log_${today}.txt # log_20220628_123000.txt

# 縮寫成一行也可以,兩行是為了日後修改方便
filename=log_$(date "+%Y%m%d_%H%M%S").txt

以下提供常用的時間格式化參數,想要更詳細的參數,可以在LInux shell上輸入 date --help 即可觀看更多。

  • 日期相關
  • %Y:西元年份,四位數,例如 2022
  • %y:西元年份,雙位數,例如 22
  • %m:月份(01~12)
  • %d:日期(01~31)
  • %u:星期(1~7),1代表星期一,7代表星期天
  • %w:星期(0~6),0代表星期天,1代表星期一
  • 時間相關
  • %H:24小時制的時(00~23)
  • %I:12小時制的時(01~12)
  • %p:AM、PM
  • %P:am、pm(參數大小寫與他的意思反過來…)
  • %M:分鐘(00~59)
  • %S:秒(00~59)
  • 其他
  • %F:等同「%Y-%m-%d」,例如 2022-12-31
  • %T:等同「%H:%M:%S」,例如 13:30:59
  • %r:等同「%I:%M:%S %p」,利如 03:11:04 PM
  • %j:一年中的第幾天(001~366)
  • %W:一年中的第幾週(00~53),星期一開始算
  • %U:一年中的第幾週(00~53),星期日開始算
  • %s:Unix時間,通常會單獨使用
  • %z:時區,例如 +0800

應用範例

每天自動將一個檔案更名,然後產生新檔案。

dayStr=$(date "+%y%m%d_%H%M%S")
mv log.txt log.${dayStr}.txt
touch log.txt

備份Docker裡面的MongoDB容器的資料庫。

docker exec mongo sh -c 'exec mongodump -d [DB_NAME] --archive' > mongo.$(date "+%Y%m%d_%H%M%S").archive

關於自動備份資料庫的教學,我有另外寫一篇更詳細的:每日自動備份Docker內的MySQL、MariaDB與MongoDB,Linux、macOS與Windows都可用

Windows Batch

Windows上面要使用就會麻煩很多,因為Windows的Date會返回時間,卻不提供格式化,因此要透過Batch的字串分割功能一個個的將字給拆開來,當時搞得我是頭都要暈了。以下是範例。

set today=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%
set filename=log_%today%.txt # log_20220628_123000.txt