Linux シェルでのファイル名形式の確認

Linux シェルでのファイル名形式の確認

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

関連情報