![Linux 셸에서 파일 이름 형식 확인](https://linux55.com/image/115036/Linux%20%EC%85%B8%EC%97%90%EC%84%9C%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%20%ED%98%95%EC%8B%9D%20%ED%99%95%EC%9D%B8.png)
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