スクリプトは、さまざまな形式の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