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
正規表現だけでは十分ではありません。検証は、正規表現の一致と日付の検証という2つの段階に分けられます。以下は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