Como posso verificar se um nome de arquivo está de acordo com um padrão?

2

Tenho a tarefa de escrever um script de shell que verifique se um nome de arquivo está em conformidade com um padrão específico e não sei como fazê-lo.

O nome do arquivo deve seguir um padrão que se pareça com:

(Project-ID)_(Env)_(Source-System-ID)_(DataDescriptor)_(CCYYMMDD)_(Seq)_(Freeformat)_(codepage)
  • O Project_ID deve ser alfanumérico e ter entre 3 e 8 caracteres.
  • Env deve consistir de um código de 3 caracteres (DEV, SYT, SIT, UAT ou PRD)
  • ID do sistema de origem deve ser um número variável
  • DataDescriptor deve ser alfanumérico, como CUST
  • CCYYMMDD deve ser uma data no formato CCYYMMDD
  • Seq deve ser um número como 01, 02, 03 etc
  • O formato livre deve ser alfanumérico - usado para fornecer a descrição adicional do nome do arquivo
  • A página de códigos
  • deve representar a extensão do arquivo, como .ascii ou .EBCDIC

Um arquivo de exemplo pode se parecer com:

ABC_PRD_00227_ACC_20130128_01_LTSB.CP1252

Se o arquivo não estiver em conformidade com o padrão, seria bom se algum tipo de aviso pudesse ser exibido.

    
por Steve 28.01.2014 / 15:42

2 respostas

5

Supondo que você use uma versão recente de zsh , ksh93 ou bash e o nome do arquivo não contenha caracteres de nova linha:

# 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
    
por 28.01.2014 / 17:00
1

Meu find-fu está fraco hoje, então não consegui encontrar o meu regex com -regex / -iregex e as opções diferentes -regextype.

Este é um pouco mais lento, mas esperamos que o ajude:

$ find . -maxdepth 1 -type f | grep -P '[[:alnum:]]{3,8}_(DEV|SYT|SIT|UAT|PRD)_\d+_[[:alnum:]]+_\d\d\d\d[0-1]\d[0-3]\d_\d\d_[[:alnum:]]+\.[[:alnum:]]+'

./ABC_PRD_00227_ACC_20130128_01_LTSB.CP1252

Supondo que você queira encontrar arquivos que não combinem com o padrão, apenas adicione a opção -v ao grep.

    
por 28.01.2014 / 17:07