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

Ste*_*eve 2 grep shell-script filenames patterns

我的任务是编写一个 shell 脚本来检查文件名是否符合特定模式,但我不知道如何去做。

文件名应遵循如下所示的模式:

(Project-ID)_(Env)_(Source-System-ID)_(DataDescriptor)_(CCYYMMDD)_(Seq)_(Freeformat)_(codepage)
Run Code Online (Sandbox Code Playgroud)
  • 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
Run Code Online (Sandbox Code Playgroud)

如果文件不符合模式,最好能显示某种警告。

gle*_*man 5

假设您使用最新版本的zsh, ksh93orbash并且文件名不包含换行符:

# 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
Run Code Online (Sandbox Code Playgroud)