#!/bin/bash #ここから、参照用リストの検索と生成 echo "参照用ファイルを検索しています" if [ ! -e relist.txt ];then #参照用リストとなるrelist.txtを検索。無ければ参照用リストの生成を行う。 echo "参照用ファイルを作成します" echo "30秒~1分ほどお待ち下さい" find -name "*.jpg" | while read row; do #findで全画像データの、ファイル名を含めた相対パスをリストとして出力し、パイプラインでwhile readにわたす。while readではリストを1行ずつ処理し、各画像ファイル名の年月日と時刻の値を全て秒に換算する。 ymd=`echo ${row} | cut -d _ -f 2` #ファイル名から年月日の値を読み出し hms=`echo ${row} | cut -d _ -f 3` #ファイル名から時刻の値を読み出し dymd=` date "+%s" -d "$ymd" ` #年月日の値を秒に換算 dhms=`echo ${hms:0:2}*3600 + ${hms:2:2}*60 + ${hms:4:2} | bc` #時刻の値を秒に換算 echo ${row}_${dymd}_${dhms} #秒に換算した年月日と時刻の値を、パスの文末に付加する done > relist.txt #relist.txtを参照用リストとしてファイル出力 echo "参照用ファイルを作成しました" else echo "参照用ファイルが見つかりました" fi echo "検索を開始します" #ここから、検索用の値の入力と処理 echo "年月日(yyyymmdd)を指定してください:" read inymd #年月日の値をinymdに入力 rymd=` date "+%s" -d "$inymd" ` #入力した年月日の値を秒に換算する echo "時刻(hhmmss)を指定してください:" read inhms #時刻の値をinhmsに入力 rhms=`echo ${inhms:0:2}*3600 + ${inhms:2:2}*60 + ${inhms:4:2} | bc` #入力した時刻の値を(1970年1月1日0時UTCからのうるう秒を考慮しないUNIX時刻で)秒に換算する #ここから、目的ファイルの検索 cat relist.txt | awk -F'[_]' -v'OFS=_' -v"ym=$rymd" -v"hm=$rhms" '{x=ym-$7;y=hm-$8;print $0,(x < 0) ? -x : x,(y < 0) ? -y : y}' | sort -k9,9 -k10,10 -t "_" -n | head -n1 | cut -d "_" -f 1-6 | tee repath.txt #catで参照用リストを読み出し、パイプラインでawkに渡す。awkでは入出力の区切り文字を"_"に指定し、先のrymdとrhmsをawk内で用いる引数としてymとhmを定義した上で、各ファイル名の年月日と時刻それぞれの値に対して入力値との差の絶対値(x,y)を計算させ、パスの文末に付加する。各行に対して付加された二つの絶対値を使って、リストをsortする。headでリストの先頭の行のみ出力させて、cutでパスの部分のみ切り出す。得られた一つの画像ファイルのパスを、ターミナル上に表示させると共に、teeでrepath.txtにも書き込む。 echo "を表示します。" eog `cat repath.txt` #repath.txtに書かれているパスをcatで出力し、eogにそのパスを入力させて目的の画像ファイルを表示させる。 rm repath.txt #一時ファイルrepath.txtの削除