シェルコマンドだけの解決を考えたができそうにないのでPHPのスクリプトで解決した。以下がそのコードです。
exifに関連する関数を使い情報を取得しています。
<?php
// コマンドライン引数で対象ディレクトリを指定
$d = dir($_SERVER['argv'][1]);
// ディレクトリを繰り返し読み込む
while(false !== ($e = $d->read())){
if(preg_match('/.?\.(jpg)|(JPG)$/',$e)){
$exif = exif_read_data($_SERVER['argv'][1] . '/' . $e , 0, true);
if(preg_match('/[pP][iI][cC].?/', $e)){
$a = preg_grep("/^TimeDate=/",preg_split("/[\s,]+/", $exif["APP12"]['Info']));
$tt = substr($a[4], 9);
if(strlen($tt) != 2){
$t = $tt - date('Z');
touch($_SERVER['argv'][1] . '/' . $e, $t);
echo $_SERVER['argv'][1] . '/' . $e ."->" . date('Y/m/d H:i:s', $t) . "\n";
}
}
if(substr($e,0,3) == 'DSC'){
$dt = split('[:\ ]',$exif['EXIF']['DateTimeOriginal']);
$t = mktime($dt[3], $dt[4], $dt[5], $dt[1], $dt[2], $dt[0]);
touch($_SERVER['argv'][1] . '/' . $e, $t);
echo $_SERVER['argv'][1] . '/' . $e . '->' . $exif['EXIF']['DateTimeOriginal'] ."\n";
}
}
}
$d->close();
?>