在 Linux shell 中验证文件名格式

在 Linux shell 中验证文件名格式

我将在 Linux 目录中接收数据文件。

我需要验证文件名是否遵循以下模式“NNN-YYYYMMDD-NNNNNNNNN.pdf”,其中

  • NNN 代表数值 (0-9)。
  • “YYYYMMDD”代表有效日期。 YYYY 是年份,MM 是月份(介于 1-12 之间),DD 是该月中的日期(可以是 01 到 31 之间的值,具体取决于月份)。
  • NNNNNNNN 是一个数字(即仅允许 0-9)。

什么实用程序(SED、AWK 等)以及我应该如何使用来验证文件名。

答案1

[[这将使用 bash 的运算符根据以下模式测试当前目录中的每个文件:

  • 字符串的开头^
  • 3位数字
  • -
  • 8位数字
  • -
  • 9位数字
  • .pdf
  • 字符串结尾$
  • 中间 8 位数字根据 GNU 日期计算为有效日期

您可以很容易地调整上述假设。

for f in *
do
  [[ $f =~ ^([0-9][0-9][0-9])-([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])-([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]).pdf$ ]] && 
  date -d ${BASH_REMATCH[2]} &>/dev/null && 
  echo Valid: "$f"
done

答案2

听上去像:

TOCHECK=( "01-20170228-12345678" "012-20170230-012345678" "01-20170228-12345678" "123-20170730-012345678" )

for CHECK in $(seq 0 $(( ${#TOCHECK[@]}-1 )) ); do
    PARTS=( $(echo ${TOCHECK[$CHECK]} | sed "s/-/ /g")   )   
    echo -ne "\nchecking "
    echo "\"${PARTS[@]}\""
    echo "\"${PARTS[0]}\""
    echo "\"${PARTS[1]}\""
    echo "\"${PARTS[2]}\""

    if echo ${PARTS[0]} | grep "[0-9]\{3\}" ; then
        echo first part ok
    fi

    if echo ${PARTS[2]} | grep "[0-9]\{9\}" ; then
        echo last part ok
    fi  

    date --date="${PARTS[1]}"
    RES=$?
    echo $RES
    if [ 0$RES -eq 0 ]; then
        echo date OK
    fi  
done

(只是一些概念性的想法,当然还有待修改)

答案3

仅使用正则表达式是不够的。验证分为两个步骤:正则表达式匹配和日期验证。这是一个 Python 实现:

from __future__ import print_function
import sys 
import re
import datetime

def validate(filename):
    match = re.match(r"[0-9]{3}-([0-9]{8})-[0-9]{8}\.pdf", filename)
    if not match:
        return False
    datestr = match.group(1)
    try:
        datetime.date(int(datestr[:4]), int(datestr[4:6]), int(datestr[6:8]))
    except ValueError:
        return False
    else:
        return True

if __name__ == "__main__":
    if validate(sys.argv[1]):
        print(":-)")
        sys.exit(0)
    else:
        print(":-(")
        sys.exit(1)

用法:python validate.py FILE

人们或许可以使用 grep 和 date 来完成同样的事情。

答案4

一种基本解决方案,使用grep.不执行详细的日期检查方面,而仅检查其数字。

if ls|grep -vE '^[0-9]{3}-[0-9]{8}-[0-9]{8}\.pdf$'; then
    echo some bogus files found
else
    echo all good
fi

相关内容