我将在 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