Shell-Script

如何檢查文件名是否符合模式?

  • January 29, 2014

我的任務是編寫一個 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, ksh93or的最新版本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

引用自:https://unix.stackexchange.com/questions/111311