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

정규 표현식만으로는 충분하지 않습니다. 유효성 검사는 정규식 일치와 날짜 유효성 검사라는 두 단계로 나뉩니다. 다음은 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

관련 정보