스크립트에서는 다양한 형식의 20,000개 이상의 사진과 비디오에서 EXIF데이터를 얻습니다.
생성 날짜를 추출하면 대부분 작동하지만 EXIF 데이터는 기록된 장치만큼만 좋고 일부 파일은 비표준 인코딩을 사용하므로 mysql에 삽입할 때 일부 오류가 발생합니다. 예를 들어
"행 1의 오류 1292(22007): 잘못된 날짜/시간 값: gphoto
행 1의 열 ..은(는) '10월 4일'입니다."pictures
genesis
mysql datetime과 호환되는지 확인하기 위해 삽입하기 전에 bash에서 "$genesis" 변수를 확인하고 싶습니다.
if [[ "$genesis" "isinformat" "2020-11-30 11:01:45" ]]; then sqlstuff...; fi
나는 정규 표현식을 사용하는 grep이 효율적인 접근 방식이 될 수 있다고 생각했습니다.
if [[ "$(echo "$genesis"|grep '^???$')" != "" ]]; then ... fi
하지만 난 알고 싶어
- 정규 표현식은 무엇입니까?
- 파이프로 연결해야 합니까, 아니면 추가 프로세스를 생성하지 않고 수행할 수 있습니까?
- 어쩌면 미리 만들어진 특정 기능이 있는 걸까요?
감사합니다!
답변1
"^[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]$"
내 목적에 맞게 grep 정규식으로 작동하는 것 같지만 더 깔끔한 방법이 있을 수 있습니다.
thanasisp가 지적했듯이 이것은 불가능한 날짜를 포착하지 않으므로 date -d로 테스트하십시오.
if [[ ! $(date -d $(echo "2015:12:12"|sed -e 's!:!/!g')) ]] &>/dev/null ; then echo "not right"; fi
실패하는 방식은 시간이 걸릴 수도 있기 때문에 다릅니다. "12:04:15"를 통과하면 수락하는 것도 유효합니다. 이는 날짜 확인을 위한 최종 솔루션으로 이어졌습니다.
if [[ ! $(date -d $(echo "12:04:15"|sed -e 's!:!/!g')) ]] || [[ ! "12:04:15" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] &>/dev/null ; then echo "not right"; fi
맥락에서 보면:
mmedia=thispic.jpg
eexifdata=($(exiftool -f -n -p '$GPSLatitude,$GPSLongitude,$CreateDate,$ModifyDate' $mmedia 2>/dev/null|sed -e 's/,/ /g' -e 's!/!:!g'))
if [[ ! $(date -d $(echo "${eexifdata[2]}"|sed -e 's!:!/!g')) ]] || [[ ! "${eexifdata[2]}" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] &>/dev/null ; then # if date format is not acceptable
eexifdata[2]="${eexifdata[3]}";eexifdata[3]="${eexifdata[4]}"; # then swap one position (exif is weird sometimes)
if [[ ! $(date -d $(echo "${eexifdata[2]}"|sed -e 's!:!/!g')) ]] || [[ ! "${eexifdata[2]}" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] &>/dev/null ; then # if issue persists
eexifdata[2]="$(date +%Y:%m:%d)" # set current date
eexifdata[3]="$(date +%H:%M:%S)" # set current time
fi
fi