在一个脚本中,我从 20000 多张各种格式的照片和视频中获取 exifdata。
当我提取创建日期时,它在大多数情况下都有效,但是 exif 数据与写入它的设备一样好,并且某些文件使用非标准编码,因此在插入 mysql 时,我最终会遇到一些错误,例如
“第 1 行出现错误 1292 (22007):日期时间值不正确:第 1行的列gphoto
..为“10 月 4 日””pictures
genesis
我想在插入之前检查 bash 中的“$genesis”变量以确保它与 mysql 日期时间兼容。
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