透過定時執行腳本完成一些自動化的工作,常常會需要使用時間來命名一些檔案。例如我想要一個檔案名稱是透過現在的日期產生的,同時包含年月日時分秒,像是「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