Shell-Script
如何檢查文件名是否符合模式?
我的任務是編寫一個 shell 腳本來檢查文件名是否符合特定的模式,但我不知道該怎麼做。
文件名應遵循如下模式:
(Project-ID)_(Env)_(Source-System-ID)_(DataDescriptor)_(CCYYMMDD)_(Seq)_(Freeformat)_(codepage)
- Project_ID 應為字母數字且介於 3-8 個字元之間。
- Env 應包含 3 個字元程式碼(DEV、SYT、SIT、UAT 或 PRD)
- Source-System-ID 應該是一個可變數字
- DataDescriptor 應該是字母數字,例如 CUST
- CCYYMMDD 應該是格式為 CCYYMMDD 的日期
- Seq 應該是一個數字,例如 01、02、03 等
- 自由格式應該是字母數字 - 用於給文件名附加描述
- 程式碼頁應代表文件副檔名,例如 .ascii 或 .EBCDIC
範例文件可能如下所示:
ABC_PRD_00227_ACC_20130128_01_LTSB.CP1252
如果文件不符合模式,最好能顯示某種警告。
假設您使用
zsh
,ksh93
or的最新版本bash
並且文件名不包含換行符:# split up the filename into its parts IFS=_ read -r pjid env srcid desc date seq free <<< "$filename" # extract the codepage from the free text code=${free##*.} free=${free%.*} # validate if [[ $pjid =~ ^[[:alnum:]]{3,8}$ ]] && [[ $env == "DEV" || $env == "SYT" || ... ]] && [[ $srcid =~ ^[[:digit:]]+$ ]] && [[ $desc =~ ^[[:alnum:]]+$ ]] && [[ $date =~ ^[[:digit:]]{8}$ ]] && date -d "$date" >/dev/null 2>&1 && [[ $seq =~ ^[[:digit:]]+$ ]] && [[ $free =~ ^[[:alnum:]]+$ ]] && [[ $code =~ ^[[:alnum:]]+$ ]] # need specific codepage validation? then echo "file name format is OK" fi